Develop/TIL(Today I Learned)

    MockMvc & WebTestClient & REST Assured

    Controlle단 유닛 테스트에 대해 알아보던 중 Spring REST Docs까지 흘러들어가 공식문서를 훑어보던 중 의존성을 추가하는 부분에서 다음과 같은 부분을 발견하였다. (공식문서) Add a dependency on spring-restdocs-mockmvc in the testImplementation configuration. If you want to use WebTestClient or REST Assured rather than MockMvc, add a dependency on spring-restdocs-webtestclient or spring-restdocs-restassured respectively instead. 위 내용을 간단하게 정리하자면 MockMvc 대신 WebTe..

    JPA에 대한 끄적임

    들어가기에 앞서... 해당 포스팅은 JPA에 대해 두서없이 간략하게 정리한 내용입니다. 그렇기에 간략히 "이런 흐름인가 보다~" 정도로만 봐주시면 감사하겠습니다. 혹여나 틀린 내용이 있다면 댓글로 알려주세요 JPA란? JPA(Jakarta Persistence API)란 Java 진영에서 제공하는 ORM(Object Relational Mapping) 기술 간단하게 말하자면 Java를 사용하면서 데이터를 RDB에 어떻게 관리할 것인가?에 대한 API Jakarta EE application programming interface specification that describes the management of relational data in enterprise Java applications. - J..

    Spring - 클래스 초기화 방법 비교 (PostConstruct, EventListener)

    예전에 Spring 프로젝트에서 Spring 기동 시 Bean으로 등록하는 클래스의 초기화 방법을 포스팅한 적이 있다. 이때는 Bean으로 등록하는 클래스가 정상적으로 생성되어 의존성 주입(DI)까지 끝난 후 초기화가 되도록 하는 방법으로 @PostConstrcut 어노테이션을 사용한 초기화 방법을 주 내용으로 기록하였었다. 이후 @EventListener(ApplicationReadyEvent.class)를 사용하여 초기화하는 방식도 알게 되어 두 방법의 차이점에 대해 기록하고자 한다. @PostConstruct 해당 어노테이션을 사용한 초기화 동작은 언급했듯 DI까지 다 끝나고 정상적으로 클래스가 생성된 이후 수행된다. 즉, 클래스가 생성된 직후 해당 어노테이션을 적용한 초기화 메서드가 실행된다고 보..

    Spring Converter & Formatter

    개발을 하다 보면 타입을 변환해야 하거나 특정 포맷에 맞춰 변환해야 하는 경우가 상당히 많다. 특히 웹 개발 관점에서 보자면 HTTP를 통한 데이터 통신은 전부 문자열(String)으로 되어있기 때문에 숫자나 날짜 등의 입력이나 출력 시 변환이 필수적으로 들어가게 된다. 이렇게 필수적으로 들어가는 변환을 매번 직접 하기에는 상당히 귀찮고 번거로울 것이다. 그렇기에 Spring에서는 이러한 기능을 수행하는 Converter와 Formatter라는 것을 지원하고 있다. 해당 기능들은 다음과 같은 동작에서 적용되어 사용된다. Spring MVC request parameter @RequestParam @ModelAttribute @PathVariable 설정 파일의 값 (properties, yml 등) @V..

    Spring MVC - 예외 처리(API)

    Spring MVC - 예외 처리(API)

    들어가기에 앞서 Spring에서 예외 발생 시 전체적인 흐름 및 에러 페이지 처리에 대한 내용은 이전 글에서 다루고 있으므로 이전 글을 참고해 주세요. 링크 : Spring MVC - 예외 처리(Error page) 에러 페이지 처리와 다른 점 뷰 템플릿 또는 정적 페이지로 예외 처리를 하는 경우에는 Spring의 도움을 받는다면 HTML 파일만 추가하여 손쉽게 해결할 수 있었다. (예외 처리를 직접 커스터마이징 하는 것은 다른 이야기) 하지만 이는 HTML 페이지를 전달할 때의 이야기이고.. API의 경우 예외 발생 시 HTML 페이지를 전달하면 안 되고 예외에 따른 JSON 포맷의 응답 데이터를 반환해야 한다. 추가로 HTTP 응답 코드도 적절하게 설정해야 할 것이다. 결국 HTML 페이지로 예외 처..

    Spring MVC - 예외 처리(Error page)

    Spring MVC - 예외 처리(Error page)

    Spring MVC에서 예외 발생시 흐름 및 처리하는 방법에 대해 간단하게 정리를 한 내용입니다. 해당 정리 글에서는 예외 발생 시 전체적인 흐름 및 에러 페이지 처리에 대한 내용을 다루며, API의 예외 처리는 다루지 않습니다. 들어가기에 앞서 Spring MVC의 예외 처리에 대한 내용에 들어가기에 앞서 필터와 인터셉터 등에 대한 HTTP 요청의 흐름을 아는 것이 우선이므로 이에 대해 간략히 알아보고 들어가도록 하겠습니다. HTTP 요청 흐름 HTTP 요청에 따른 흐름은 위 이미지와 같이 WAS에서 Servlet Filter를 통과하여 Spring Interceptor를 통과하게 됩니다. (Filter와 Interceptor에 대한 자세한 내용은 "Servlet Filter & Spring Inter..

    Servlet Filter & Spring Interceptor

    Servlet Filter & Spring Interceptor

    Servlet Filter와 Spring Interceptor는 웹과 관련된 공통 관심 사항에 대한 내용을 처리하기 위한 기능이며, 차이점은 어디서 제공하는 기능이냐? 적용되는 위치가 어디냐?로 나누어 볼 수 있다. 여기서 공통 관심 사항이란 단어를 보고서 AOP(Aspect Oriented Programming)를 떠올릴 수 있겠으나 웹과 관련된 공통 관심 사항의 경우에는 HTTP header나 URL 정보 등이 필요한데 이러한 정보를 FIlter 및 Interceptor에서 제공하기 때문에 이를 이용하는 것이 좋다. 웹과 관련된 공통 관심 사항의 대표적인 예시로는 어떠한 요청이 들어왔는지를 기록하기 위한 로깅 기능 또는 특정 요청에는 인증/인가된 유저만 접근이 가능하도록 하는 인증/인가 기능이 있다...

    JPA - 엔티티 수정(merge, dirty check)에 대한 내용 정리

    JPA(Java Persistence API -> Jakarta Persistence API)를 사용할 때 엔티티를 수정해야 할 때 아래처럼 2가지 방법이 있다. 병합(merge) 변경 감지(Drity checking) 아주 간단하게 정리하자면 "병합"은 수동, "변경 감지"는 자동이라고도 볼 수 있다. 사실 두 방법에 대한 중요한 차이점은 직접 명시하니 자동으로 해주니가 아닌 "어떻게 동작하는가?"라고 볼 수 있다. 일단 병합을 사용한 엔티티 수정에 대해 정리해보자 병합(merge) 병합의 경우 수정된 엔티티를 직접 merge() 메서드를 통해 반영시킨다. 이 때 엔티티의 모든 속성을 갱신하게 되기 때문에 비어있는 속성이 있는 경우 Null이 DB에 반영 될 수 있다. 병합을 사용해야 하는 경우는 준영..

    트랜잭션 스크립트 패턴과 도메인 모델 패턴

    간단하게 보면 비즈니스 로직 구현을 어디에서 하는가에 따라 트랜잭션 스크립트 패턴과 도메인 모델 패턴으로 나뉘게 된다. 트랜잭션 스크립트 패턴 트랜잭션의 동작처럼 특정 기능의 플로우를 스크립트와 같이 하나의 메서드에 구현하는 방법 해당 패턴은 엔티티에는 비즈니스 로직이 거의 없으며, 서비스 계층에 비즈니스 로직이 집중되어 있다. 장점으로는 일반적으로 익숙한 방법이기에 구현이 쉽다는 점이 있으며, 각각의 기능에 대해 모듈화를 잘 한다면 효율도 좋게 나온다. 즉, 모듈화를 잘 한다면 쉽게 개발이 가능하며 효율도 좋다는 의미 하지만 로직이 복잡해질수록 코드가 난잡해지며, 도메인 분석/설계에 대한 개념이 약하기 때문에 코드의 중복을 막기 어렵다는 단점이 있다. 도메인 모델 패턴 해당 패턴은 대부분의 비즈니스 로..

    SpringBoot 기준 log 정리

    SpringBoot 프로젝트의 경우 "spring-boot-starter-web" 의존성 내에 "spring-boot-starter-logging" 의존성이 포함되어 있으며, 해당 의존성에는 다음과 같은 로그 관련 라이브러리들이 포함되어있다. logback slf4j log4j 여기서 slf4j는 여러가지 로그 관련 라이브러리들을 통일된 방식으로 사용할 수 있도록 지원하는 인터페이스라고 보면 되고, 실제로 로그를 사용할 수 있도록 지원해주는 라이브러리들이 logback, log4j 라고 보면 된다. 그리고 SpringBoot 프로젝트에서는 기본적으로 logback을 사용한다. 사용 방법 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public Lo..