개요 간단하게 채용에 관련된 도메인을 설계를 했다. 보통 채용 공고를 작성할 때 경력직의 년차를 설정한다. 하지만 해당값을 Enum으로 관리하고 싶다. Enum값으로 관리하려는 이유는 여러가지가 있다. 해당 필드값을 사용할 때 컴파일러가 Enum값 타입을 검사해줘서 코드의 대한 안정성이 높아진다. 유지보수하기가 쉬워진다. 공통으로 사용하는 Enum은 수정사항이 있을 경우 그 부분만 수정하면된다. 가독성이 좋아진다. 상수값으로 되어있어서 보기가 편하다. 보통은 Enum값이 String으로 하나인경우 @Enumerated(EnumType.STRING) 을 사용하면 된다. 하지만 나의 경우에는 경력직의 년차의 Enum값 같은 경우에는 년도를 나타내는 Year이라는 int값과 해당 데이터를 텍스트로 나타내는 S..
개요 테스트마다 필요로하는 어노테이션을 매번 작성해주는 경우 만약 변경사항이 있을 경우 매번 수정해주는 부분이 유연성이 떨어진다. 그래서, 특별한 이유가 있지 않은 이상 테스트 환경은 공통으로 구성하고 사용하는게 유지보수 측면에서 좋다. 커스텀 어노테이션을 구성해도 괜찮지만 만약 공통으로 @Autowired나 @Mockbean처럼 의존성을 주입하는 경우가 있는 경우 추상 클래스로 만드는 경우가 더 낫다. 통합테스트 밑과 같이 3개의 어노테이션이 통합테스트에 공통으로 쓴다면 @ActiveProfiles("test") @WithMockUser(username = "test", roles = "USER") @SpringBootTest 1. IntegrationTestSupport.class 라는 추상 클래스를..
Test Double이란? 객체를 mocking 하여 테스트 하는 방법들을 칭한다. 객체를 mocking해서 테스트하는 여러개의 방법들이 존재한다. 이 글은 외부 API를 stubbing해서 테스트하는 방법을 설명하는 글이여서 Test Dobule 에 관한 자세한 내용은 정리 잘되어있는 글의 링크(https://hudi.blog/test-double/)를 첨부한다. Stubbing 이란? Stub은 특정 메서드나 함수 호출에 대한 기대 동작을 갖춘 객체로, 특정 상황에서 함수 호출 시 미리 정의된 값을 반환하거나 미리 정의된 동작을 수행합니다. Stub은 주로 특정 함수의 행동을 테스트하기 위해 사용되며, 실제 로직은 포함하지 않을 수 있습니다. 예를 들어, 데이터베이스나 외부 서비스 호출을 대신하여 ..
개념 알아보기 슬라이스 테스트란? 특정 계층 테스트를 말한다. @SpringBootTest를 사용하여 통합테스트를 하는것보다 슬라이스 테스트를 하면 더 작은 단위로 쪼개어 테스트하기 때문에 테스트 시간이 짧고, 관련 없는 빈들을 로드하지 않아 통합테스트보다 가볍고 빠른 테스트가 가능하다. @WebMvcTest: 웹 계층의 컨트롤러(Controller) 테스트를 위한 슬라이스 테스트입니다. @Controller, @ControllerAdvice, @JsonComponent, Converter/GenericConverter, Filter, WebMvcConfigurer and HandlerMethodArgumentResolver 관련 bean들이 로드됩니다. @DataJpaTest: JPA관련 테스트를 위한..
TDD(Test Driven Development)란? 테스트 중심적 개발이다. -> 테스트를 중심으로 개발하는 개발 방법론이다. 당연히 TDD는 설계 테스트 등 복잡하지만 이글에서는 간단하게 TDD관련된 메인 아이디어만 맛보기로 예시와 작성한 글이다. TDD 작성 단계 RED: 테스트를 먼저 작성한다. 구현이 없으므로 테스트는 실패 해야한다. GREEN: 테스트를 성공시키기 위해 최소 요구조건에 맞게 코드 품질 상관없이 구현한다. REFACTOR: 테스트 코드를 성공하면서 개선하고 리팩토링한다. Advantages: 협력 & 문서 -> 많은 개발자들이 협력해도 테스트 코드가 작성이 잘 되어있으면 파악이 쉬워 개발 생산성이 향상된다. 좋은 설계 -> 테스트 코드를 짜면서 코드를 분리하고 리팩토링 함으로써..
Servlet Filter는 언제 필요할까? 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 한다.애플리케이션을 개발 하다 보면 이러한 공통 관심사를 사용할 때가 많다. 쇼핑몰을 예를 들면 등록,수정,삭제 라는 기능을 로그인 한 사람만 사용할 수 있어야한다. 일일히 컨트롤러에서 조건문을 걸어주면 나중에 로그인 관련 로직이 변경되면 수정해야하는 부분이 많으므로 유지보수 측면에서도 좋지않다. 해결법은 공통 관심사로 나눈 후 공통으로 처리하면된다, 이러한 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 지금부터 설명할 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련(특정 관련 url처리)된 공통 관심사를..
싱글톤 컨테이너란? 싱글톤 컨테이너는 싱글톤 패턴의 문제점을 해결하면서 효율적으로 인스턴스를 공유하며 효율적으로 사용할 수 있게 도와준다. 기본적으로 스프링 빈들은 싱글톤으로 관리되는 빈이다. 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 컨테이너는 하나의 인스턴스만 생성하고 관리한다. 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 싱글톤을 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. 이 기능을 사용함으로써 싱글톤 패턴을 위한 지저분한 코드를 작성할 필요도 없고 DIP,OCP,테스트, private 생성자로부터 자유롭게 싱글톤을 사용할 수 있다. 싱글톤 테스트를 해보자! @Configuration public class AppConfig { @Bean public MemberServi..
예외 처리를 왜 필요할까? 발생하는 예외에 따라 응답값을 다른 HTTP Status 값으로 보내줘야 명확히 어떤 예외가 터졌는지 파악 한 후 처리할 수 있다. 그래야 응답값에 따라 메세지/화면을 처리하여 사용자에게 더 나은 사용성을 제공한다. 예외 처리하는 다양한 방법들을 알아보자. HandlerExceptionResolver 사용하기 Exception Resolver 동작과정 적용 전: Request -> Dispatcher Servlet -> Handler Adaptor -> Dispatcher Servlet -> Reseponse 적용 후: Request -> Dispatcher Servlet -> Handler Adaptor -> Exception Resolver -> Response @Slf4j..
JUnit 5 이란? JUnit은 자바에서 대표적인 unit-testing 프레임 워크이다. JUnit 5 버전은 또한 Java 8 에 등장한 새로운 기능들도 지원해주면서 Java 8 버전과 호환성이 좋다. unit-test(단위 테스트) 사용이유: 전체적으로 말했을 때 유닛테스트는 버그를 줄이고 코드 퀄리티를 높이기위해 만든다. 또한 어플리케이션이 무거울 경우에 테스트하기 위해 매번 서버를 껐다 키면 시간적인 비용과 소모되는 자원들이 많다. 하지만 단위 테스트를 함으로써 단위만 실행시키면되서 더욱 빠르게 정상적으로 작동하는지 확인할 수 있다. 스프링 부트 2.2.1 버전의 스프링 부트 이상 프로젝트는 기본적으로 spring-boot-starter-test 가 제공하는 JUnit 버전은 5 버전으로 추가..
개요 갑자기 문득 @RequiredArgsConstructor 를 사용하면서 의문점이 들었다. 두루뭉실하게 왜 사용하는지는 알겠는데 이 방법을 권장하는 이유에 대해서 명확히 설명을 못하겠어서 다시 공부할 겸 글을 작성하게되었다. 기본적으로 생성자 주입 방법에는 대표적으로 3개가 있다. 생성자 주입: 생성자를 통해 의존성을 주입 수정자 주입: Setter를 사용해 의존성을 주입 필드 주입: 필드를 사용해 의존성 주입 생성자 주입 public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){ this.memberRepository = memberRepository; this.discountPolicy = di..