최근에 NextStep(넥스트스탭)에서의 TDD, 클린코드 With Java 를 수강하면서, 첫번째 미션인 자동차 경주를 구현하던 도중, 리뷰어님께서 아래와 같은 말씀을 해주셨다. 처음에 작성한 코드는 아래와 같았다. public class Car { private static final int MOVE_CONDITION = 4; ... private boolean isMove(int randomNum) { return randomNum >= MOVE_CONDITION; } } 위 코드대로라면 만약 Car의 객체가 조금 다르게 4보다 큰 것이 아닌 5, 7보다 크다면 매번 Car 라는 클래스를 새로 만들어야 한다. 이번 글에서는 위 로직을 전략패턴을 사용하여 위 이슈를 리팩토링을 하면서 정리하고자 한다...
1. 에러 발생 상황 - Java 에서 크롤링을 위해서 Selenium 을 사용하고자 하였는데 아래와 같은 에러가 발생. - 크롤링을 위해서 Chrome 브라우저 창을 열어 접속을 시도한 것 같은데, WebSocket 에 대한 연결을 할 수 없다는 메시지 같았다. org.openqa.selenium.remote.http.ConnectionFailedException: Unable to establish websocket connection to http://localhost:53222/devtools/browser/40fe271d-cd90-4cf0-8440-600b29aa2fe4 Build info: version: '4.1.4', revision: '535d840ee2' System info: host..
팀 회의 중 각 담당 업무 이슈에 관련 이야기를 나누다가 어떤 서버의 프록시 서버 설정에 문제가 있다는 이야기를 나누고 있었다. 그런데 팀장님이 갑잡스러운 질문을 하셨다. 팀장님 : 포워드 프록시랑 리버스 프록시 차이점을 알아??? 나 : 어...음... 포워드 프록시는 서버에서 들어오는 쪽이고, 리버스 프록시는 서버에서 나가는 쪽을 관리를 하는 것으로 알고 있습니다. 틀린 말은 아니였지만, 대답을 하고 나서도 정확히 어떠한 역할을 하고 무슨 차이가 있는지는 명확하게 떠오르지 않았다. 그렇기에, 이번 글에서 위 2가지에 대해 정리해보고자 한다. 1. Proxy(프록시) 란? - Proxy(프록시) 서버는 클라이언트(Client)가 자신을 토해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴..
개발을 진행하다보면 sync, async, blocking, non-blocking 를 고려해서 개발을 해야할 때가 발생하고, 적절하게 사용해야만 한다. 위 개념들을 살펴보면 비슷한 내용인 것 같아 같아보이지만 관점에 따라 다른 기능을 제공한다. 단지 이 개념들을 서로 조합해서 사용되는 것 뿐이다. 동기(sync)와 비동기(async)는 프로세스의 수행 순서 보장에 대한 매커니즘이며, 블록킹(blocking)과 논블록킹(non-blocking)은 프로세스의 유휴 상태에 대한 개념이다. 이번 글에서는 위 개념들을 정리하고 비교해보고자 한다. 1. Sync VS Async 1-1. Sync(동기, Synchronous) - Sync(동기)는 동시에 일어난다는 의미를 가진다. - 요청과 결과가 동시에 일어난다..
참고!!! 해당 블로그에서는 티스토리 스킨으로 인해 기존 Markdown 형식처럼은 나오지 않습니다... 실제 비교는 깃허브 Readme.md 를 참고해주시기 바랍니다. 1. Headers(헤더) ~ 까지 가능하다.# This is a h1 tag ## This is a h2 tag ##### This is a h5 tag This is a h1 tag This is a h2 tag This is a h5 tag 2. Horizontal Rule(수평선) 아래 코드들 모두 사용 가능하다.--- *** ___ ****** 3. Line Breaks(줄바꿈) (띄어쓰기 두번) 4. Emphasis(강조) 사용하고자 하는 부분에 붙여서 사용한다._Italic(이탤릭)_ or *Italic(이텔릭)* **굵은 ..
Java 에서 Lambda 를 사용하면서 개발하던 도중 아래 에러 메시지를 보여주면서 빨간 줄이 그어져 있었다. Variable is accessed from within inner class needs to be final or effectively final 대충 직역해보면 "내부클래스(Inner Class)안에 있는 변수에 접근할 때는 그 값이 final 이나 effectively final 형태여야 한다." 이다. 원하던 로직은 Stream 을 사용해서 어떠한 값이 있는 경우 카운트를 하고 싶었다. 이 과정에서 지역변수(cnt)를 람다안에서 사용하고자 하니 위 에러가 발생하였다. int cnt = 0; memberList.stream().forEach(test -> { if(test.getTeam..
개인적인 스터디 진행 시 개인 Github 로 진행이 아닌 모임에서의 다른 사람의 Repository 를 공유하여 진행할 때가 있다. 이러한 경우 Github 의 Organizations 기능을 활용하여 Repository 를 관리가 가능하다. 그러나, Organizations 되어진 Repository 를 Intelli J(인텔리제이)에 Clone 을 진행하려면 아래와 같은 에러가 발생한다. 정확한 내용은 모르겠지만, 구글링 해보았을 때 에러 내용은 보안 문제로 인해 해당 Github 주소를 불러올 수 없다는 것이었다. 인텔리제이로 Git Clone 시 계정인증을 요청하는데, 이때 2가지 방법이 있다. Log In via GitHub - Github 계정 연동 허용을 통해 로그인 log in with ..
로컬 환경에서 MySQL 로 GROUP BY 를 하려고 하면 아래 에러가 발생하였다. select department_id, admission_year, count(1) as cnt from student_table group by department_id, admission_year ; Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'department_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 쿼리만 본다면 잘못..
종종 Spring + MyBatis 개발을 하던 도중에 ResultMap 또는 ResultType 에 InnerClass 로 선언하고자 하는 경우가 있다. 1. 파일 구성 - 간단하게 예제를 통해서 진행해보겠습니다. - ResultType 에서 사용하고자 하는 파일은 아래와 같습니다.(Response 를 사용) 실제 개발에서는 DB의 값을 그대로 전달하는 것은 좋은 방법이 아니지만, 간단한 테스트를 위해서 바로 사용하였습니다. public class TodoDto { @Builder @AllArgsConstructor @NoArgsConstructor public static class Request { private String item; private boolean completed; } @Data ..
1. 에러 발생 상황 - MyBatis(마이바티스) 를 통해서 DB 에서 데이터를 조회하려는 도중 아래와 같은 에러가 발생. ### Cause: java.lang.IndexOutOfBoundsException: Index 4 out of bounds for length 4] with root cause java.lang.IndexOutOfBoundsException: Index 4 out of bounds for length 4 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[na:na] at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(..