테스트 코드 작성해야한다, TDD 해야한다, 말은 많이 들었다. 인프런의 김영한님도 말씀하시더라. 테스트코드 없이 개발하는 것은 불가능하다고. 그 말을 처음 들었을 땐 별 감흥이 없었는데 이번에 자바/스프링으로 신규 프로젝트를 진행하며 온몸으로 테스트 코드 작성의 중요성을 깨달았다. 이 글에서는 내가 테스트가 번거로웠던 많은 로직들 중에 한가지를 샘플링하여 가져와 그 중요성을 설명할 것이다. 테스트 코드를 작성하지 않는다면 어떤식으로 개발해야할까? 아직 완성되지 않은 서비스를 테스트 할때 여러 변수들에 임의의 값을 넣어주고, 종속된 다른 클래스에도 임의의 값을 넣어줘야하고, 데이터를 꺼낼때도 임의의 값을 넣어줘야한다. 때에 따라선 이보다 훨씬 부가적인 작업이 많을 것이다. 이를 수동으로 처리하면 어떻게 ..
전체 글
저의 생각과 경험을 쉽고 재미있게 공유해요 📖![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9fHko%2FbtrvY3Sx9pa%2FmiRCECZf16vCKInYhzOXh0%2Fimg.jpg)
들어가기 온라인 쇼핑몰을 생각해보자. 마음에 드는 물건을 카트에 담았다. 계속해서 둘러보고 다른 물건도 카트에 담아서 확인을 해봤는데 앞에 물건이 없다? 우리가 원하는 것은 내가 카트에 물건을 담아도 사라지지 않는 것이다. 그 상태를 유지하고 싶다. HTTP 프로토콜은 기본적으로 stateless(무상태)이다. stateless라는 의미는 서버-클라이언트 간의 통신 시에 이전 통신 정보를 저장하지 않는다는 의미이다. 즉, 물건을 담는 요청을 하면 물건을 담지만 그 상태를 유지하지 않는다. 서버와 클라이언트는 독립적이며 그렇기 때문에 서버에 어떠한 정보도 저장하지 않는다. 앞서 예시를 든 것은 stateless가 아니라 stateful, 사용자의 상태를 유지하기 위한 방법이 필요하다. 쿠키와 세션은 이런 ..
타임리프로 개발하다보면 아래와 같은 예외를 무조건 만나게 될것이다. org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: 위 예외는 타임리프 문법에서 객체에서 필드를 꺼내올때 타임리프에 적은 필드명이 객체 없으면 나는 에러이다. 예를 들어서 public class Person { private String name; private Integer age; // getter, setter, constructor ... } 이름: 나이: 위와 같이 person.age를 가져와야하는데 person.AGE를 가져오는거같이 person이 가지고 있지 않은 필드를 가져오면 아래 예외가 터진다. org..
들어가기 처음에 예외처리하여(Exception) 클라이언트에게 원하는 데이터를 내보낼수 있다는 사실을 몰랐다. 그때 해결하려했던 생각은 ErrorMessage라는 객체를 만들어서 서비스층에서 조건에 걸리지 않으면 ErrorMessage 를 return 하려고 했다. 그렇게 하려고 했던건 다시 말하지만 단순히 예외처리를 하였을 땐 따로 JSON 데이터로 사용자에게 응답을 주지 못할 것이라고 생각하였기 때문이다. 그래서 아래와 같은 방법으로 해결하려고 했다. 첫번째 방향 하고 싶었던 것은 아래 코드처럼 예외를 throw 하되 클라이언트에 데이터를 같이 응답해주고 싶었다. public String sendAuthMail(String userId) throws Exception { String authKey; ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIVtB4%2FbtrqQeksMCo%2F6DenYbXzxxZhZScV8dCpmk%2Fimg.jpg)
들어가기 인프런-스프링 핵심 원리에서 싱글톤 컨테이너에 대해 배우고 정리한 것입니다. 먼저 싱글톤이란 생성자를 통해 계속 인스턴스를 만들어 사용하는 것이 아니라 클래스를 한번만 메모리에 할당하여 그것을 계속 재활용하는 디자인 패턴을 말합니다. 특정 디자인 패턴이 만들어진 이유가 있을겁니다. 싱글톤도 그런 이유가 있습니다. 코드를 보면서 알아봅시다. 쌩자바로짠 서비스 객체 public class Service { public void logic() { System.out.println("객체 로직 호출"); } } 기존에 쌩자바로 어떤 서비스를 사용자가 호출하게 되면 위 이미지처럼 여러 사용자들이 Service를 호출하여 그때마다 새로운 인스턴스가 생성되어 사용했습니다. 예를들어 배달의민족에서는 초당 5만..
VO를 이해하기 위해서 기발한 예시가 생각났음. 두 사람이 만원짜리 지폐 한장씩 들고 있다. 그것을 서로 교환했다. 지폐의 번호(메모리 주소값)는 달라졌지만 그들이 교환한 지폐의 본질(속성)에는 차이가 없다. 그리고 사람들은 이것을 "같다고" 말한다. 나 같은 경우엔 Value Object라는 것을 체스를 구현하는 프로젝트에서 필요성을 느꼈다. 간단하게 콘솔로 구현하는 프로젝트인데 코드를 테스트할 때였다. 체스말들은 폰, 킹, 퀸, 룩 등 체스판이라는 리스트 안에 있다. 나는 체스판의 특정 좌표에서 특정 체스말을 get하여 개별적으로 생성자를 통해 만들어진 체스말을 비교하여 두개의 체스말을 같은지 아닌지 테스트하려고 했다. 의도하려 했던 테스트는 당연히 같은 속성을 가진 체스말이기 때문에 객체가 가지고 ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHrmT%2FbtrvNSrKjEX%2FigFeQE8hP3feIryOdgprAk%2Fimg.png)
윈도우10에서 레거시 개발 환경 (Apache2.4 + PHP5.3.29 + MySQL5.7) 을 구축하려고 하는데 생각보다 쉬운 작업이 아니었다. 단순히 윈도우에서 구동되는 PHP5.3.29를 구하는 것도 어렵다. 어떻게 구했다한들 인터넷에 있는 여러 참고자료들을 보면서 똑같이 해봐도 문제점이 많이 발생한다. 작업하다가 실수로 다른 버전을 설치하거나 환경 설정을 잘못해줘서 리셋해줘야하는 상황이 오면 그것 또한 엄청 번거롭다. 이걸 해결할 수 있는 게 도커라고 생각했다. 가장 좋은 점은 내가 실수했어도 간단히 컨테이너 지우고 이미지를 pull해서 다시 작업하는 게 정말 편하다는 것이다. 마치 콘솔게임하면서 중간중간에 세이브하면서 캐릭터가 죽으면 로드하는거랑 비슷한거 같다. 뭔갈 구축하려고 열심히하다가 그..