
실무에서 보통 개발 환경별로 application profile을 분리한다. 현재 회사에서 사내망(dev, stg, prod), 사외망(dev, stg, prod)에서 각각의 yml로 설정을 분리하는 방식을 사용했다. 기능이 추가될수록 yml 파일은 커지고 누군가는 똑같이 맞추기 위해서 그대로 설정을 다른 yml에 붙여넣으면서 배보다 배꼽이 더 커지는 것을 보고 배꼽을 눌러주기 위해 profile 분리에 대해 공부하고 적용했다. 환경 MACBOOK AIR M1 Intellij ultimate spring boot 2.7 maven3 jdk17 기본적으로 local 환경에서 구동할 경우 어떤 환경으로 서버를 구동할지에 대한 설정이 필요하기 때문에 profiles.active 혹은 profiles.defau..

해당 포스트는 김영한님의 강의와 ORM 표준 JPA 프로그래밍 책을 보면서 작성했습니다. 솔직히 JPA부터 시작해본 입장으로써 객체지향 그리고 관계형 디비 사이의 패러다임의 불일치 해소와 같은 말이 이해되지 않았다. 하지만 회사에서 JPA를 사용하기도 하지만 MyBatis, JdbcTemplate를 사용하는 도메인을 개발하다보면 어느새 나는 java보다 sql, xml에 몰두하고 있는 모습을 볼 수 있었다. 뒤늦게 JPA의 기능에 감탄하면서 사용했지만 JPA가 알아서 쿼리를 만들고, 실행하고 트랜잭션을 관리하는 점에서 오히려 내가 모르는 쿼리들이 추가적으로 실행되고, 제어하기 어려운 경우가 많았다. 쓸 거면 제대로 이해하고 쓰기 위해 정리해보자. JPA JPA, Java Persistence API의 약..

테스트 코드 네이밍 메서드명_테스트상태_기대결과 코드 리팩토링으로 인하여 메서드명이 변경되는 경우 테스트 명 또한 변경되어야 하는데, 변경되지 않으면 나중에 이 TC를 이해하기 어렵게 되므로 바람직하지 않다는 의견이 있다. 예시 isAdult_AgeLessThan18_False withdrawMoney_InvalidAccount_ExceptionThrown admitStudent_MissingMandatoryFields_FailToAdmit 메소드명_기대결과_테스트상태 위와 비슷한 형태이지만, 일부 개발자들은 이런 컨벤션을 사용할 것을 추천한다. 이 컨벤션 또한 메서드명이 바뀌면 나중에 이해하기 어렵다는 단점이 있다. 예시 isAdult_False_AgeLessThan18 withdrawMoney_Thr..

다크 모드에서 그림이 잘 보이지 않습니다. 라이트 모드에서 읽는 것을 추천합니다. 오늘의 목표는 스프링이 요청을 처리하는 내부적인 원리 이전에 서버가 클라이언트의 요청을 어떻게 처리하는지에 대한 큰 틀을 이해하는 것이다. Tomcat(WAS) Tomcat은 WAS(Web Application Server)의 대표적인 미들웨어 서비스이다. WAS는 웹 서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현하여 다양한 역할을 수행할 수 있는 서버를 말한다. 클라이언트의 요청이 있을 때 내부의 프로그램을 통해 결과를 만들어내고 이것을 다시 클라이언트에 전달해주는 역할을 하는 것이 바로 웹 컨테이너이다. Flow Web server 웹 서버는 사용자가 웹 브라우저에서 URL 입력했을 때 사용자에게 응답을 ..

실무에서 API상 GET method를 사용하지만 list를 받아와야 했는데, Spring에선 일반적으로 RequestBody를 사용할 수 없었다. (HttpMessageNotReadableException) 물론, 조금 찾아본 바로는 2014년 후에 나온 RFC7230-7237 Spec을 확인해본 결과로 Request message framing is independent of method semantics, even if the method doesn't define any use for a message body 라는 문구가 추가됐는데, 이는 method 의미와 requestBody의 의미 체계는 독립적이라고 표현을 하는 것 같다. 평소처럼 List로 파라미터를 설정해서 값을 받았는데, 읽어오질 못..

오늘은 같은 타입의 빈이 여러 개인 경우 식별하는 방법을 포스팅한다. 주제는 빈을 식별하는 방법으로 코드의 내용은 신경쓰지 않고 단순히 구분을 위해 작성했다. public interface MailService { void sendEmail(String email); } @Service public class NaverMailServiceImpl implements MailService { @Override public void sendEmail(String email) { System.out.println("Send naver mail to " + email); } } @Service public class GoogleMailServiceImpl implements MailService { @Overr..

백기선님의 강의를 기반으로 내용을 포스팅하고 있다. Spring에서 사용되는 IoC란 객체가 내부적으로 조작할 객체를 직접 생성하지 않고 외부로부터 주입받는 기법을 의미한다. 이때 객체를 외부로부터 주입해주는 작업을 DI(의존성 주입)이라고 부른다. 이때 IoC Container에 의해 관리되는 오브젝트들은 Bean 이라고 부른다. Bean은 일반 객체와는 다르게 라이프 사이클 인터페이스를 제공한다. OwnerController bean = applicationContext.getBean(OwnerController.class); // Bean OwnerController notBean = new OwnerController();// Bean이 아님 IoC Container는 Bean을 저장하고 관리하기..

이번 포스팅은 javax.validation package에 있는 검증 관련 어노테이션을 다뤄본다. 또한, 추가적으로 위의 어노테이션과 헷갈릴 수 있는(?) lombok package에 있는 NonNull 어노테이션과의 차이도 간단하게 나타낼 예정이다. javax.validation package 보통 validation은 컨트롤러단에서 주로 사용된다. 클라이언트에서 서버로 넘어온 객체 내의 필드를 검증해서 서비스 단으로 넘길 필요가 없기 때문이다. 우리가 javax.validation package의 @Valid를 사용하면 검증 필드에 javax.validation.constraints 내의 검증 어노테이션들을 사용하게 되는데, 이번 포스팅은 제목과 같이 null과 관련된 어노테이션을 다룰 것이고 그 ..