본문 바로가기
반응형

전체 글98

[오픈소스] MapStruct 소개와 사용법 클린 아키텍쳐, 멀티 모듈, 많은 계층 등으로 구성되어 있는 어플리케이션을 개발하다 보면 데이터 모델 간 객체 변환이 꼭 필요하다. 이 때, 한땀한땀 필드를 맵핑해줄 수도 있지만 이 작업을 대신 해주는 오픈소스인 MapStruct 에 대해 알아보도록 하자. 예시 소개 아래와 같은 구조로 프로젝트가 설계되어 있다고 가정을 해보자. 내부 Domain 에서 사용하는 클래스는 Blog, application-layer 와 web-layer 가 서로 통신을 할 때에는 BlogDto, 그리고 외부 HTTP 통신을 할 땐 NaverBlogResponse, KakaoBlogResponse 등으로 데이터를 주고 받을 수 있다. 모두 다 같은 의미의 데이터를 포함하고 있지만 각 계층을 구분짓기 위해 클래스를 분리했다. 이.. 2023. 2. 8.
[스프링] @Valid 사용과 테스트 케이스 작성하기 RestController 에서 @RequestBody 등을 통해 데이터를 받을 때, 유효성 검증을 위해 @Valid 어노테이션을 주로 사용한다. 필수 값이 입력되어 있는지, 숫자 값의 boundary 내에 포함되어 있는지, 문자열의 길이가 유효한지 등을 확인할 수 있다. 의존성 추가 아래 의존성을 추가하면 @Valid 어노테이션을 사용해서 유효성 검증을 할 수 있다. implementation 'org.springframework.boot:spring-boot-starter-validation' 활용 방법 아래 컨트롤러의 SearchBlogRequestBody 부분을 보면 객체 앞부분에 @Valid 어노테이션이 부여되어 있다. @RestController public class BlogSearchCon.. 2023. 2. 6.
[자바] Stream .sorted() 활용 자바 Stream 에서는 sorted() 함수를 제공한다. 예제 예시를 통해 알아보자. 검색한 키워드와 키워드별 횟수를 나타내는 객체이다. stats 리스트 객체에는 총 5개의 객체가 담겨있다. 이 리스트 객체를 활용해서 sorted() 함수에 사용해보자. @Getter public class BlogStatisticDto { private final String keyword; private final String count; @Builder public BlogStatisticDto(String keyword, String count) { this.keyword = keyword; this.count = count; } } public static void main(String[] args) { Li.. 2023. 2. 6.
[스프링] REST Docs, asciidoctor 로 API 문서 관리하기 테스트 대상 Controller @RestController public class BlogSearchController { private final SearchBlogUseCase searchBlogUseCase; public BlogSearchController(SearchBlogUseCase searchBlogUseCase) { this.searchBlogUseCase = searchBlogUseCase; } @GetMapping("/api/v1/blogs") public ResultResponse searchBlogs( @Valid SearchBlogRequestBody requestBody, @RequestParam(required = false, defaultValue = "1") int pa.. 2023. 2. 6.
[스프링] JPA 관련 통합 테스트 환경 구축하기 통합 테스트 환경을 구축하는 법을 알아보자. 테스트 대상 통합 테스트 환경을 구축하면서 테스트를 해볼 대상은 영속성 (Persistence) 관련 클래스들이다. JPA 를 사용해서 데이터에 대한 생성, 조회, 수정, 삭제, 즉 CRUD 기능을 테스트해보려고 합니다. 테스트를 위한 DB 는 h2 를 사용합니다. 예시에서 사용될 테스트 대상으로 JpaRepository 를 상속받는 BlogStatisticJpaRepository public interface BlogStatisticJpaRepository extends JpaRepository, BlogStatisticCustomRepository { } 의존성 설정 아래 의존성을 build.gradle 파일에 적용한다. // build.gradle.kts.. 2023. 2. 6.
[스프링] JUnit5, AssertJ, Mockito 기반 테스트 환경 구축하기 JUnit5, AssertJ, Mockito 를 활용해서 스프링 부트에서 테스트 환경을 구축해보자 의존성 추가 아래를 참고하여 의존성을 추가한다. 각 의존성에 대한 버전은 최신 버전으로 추가해주면 될 듯하다. dependencies { // JUnit 라이브러리 testImplementation("org.junit.jupiter:junit-jupiter-api") testImplementation("org.junit.jupiter:junit-jupiter-params") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") // 테스트 코드의 가독성을 높여주는 메소드를 위한 라이브러리 testImplementation("org.assertj:assertj.. 2023. 2. 6.
[자바] String 과 new String(); 의 차이 개발을 하다 문득 String 과 new String() 의 차이가 무엇일지 궁금해져서 정리해보고자 한다. String String a = "abcd"; String b = "abcd"; 위와 같은 경우에는 heap 내 String constant pool 에 객체를 저장한다. 만약 이미 존재하는 문자열이라면 그 저장된 객체를 가르키게 되어 있다. 따라서 변수 a 는 String constant pool 에 새로운 객체로 생성되고, 변수 b 는 동일한 abcd 값이 저장되어 있기 때문에 변수 a 의 참조값을 가르키게 된다. // a 와 b 는 서로 동일한 주소값을 참조하고 있으므로 a == b 는 true if (a == b) { // true ... } // a 와 b 는 서로 동일한 값을 가지고 있으.. 2023. 2. 3.
[스프링] 스프링에서 관리하는 자바 객체, 빈 (Bean) 빈 (Bean) 이란? 스프링 IoC 컨테이너가 관리하는 자바 객체를 의미한다. 자바 객체 일반적인 자바 객체는 아래와 같이 클래스를 선언하여 사용한다. public class Car { private final String name; public Car(String name) { this.name = name; } public void turnLeft() {...} } public class MainApplication { public static void main(String[] args) { Car car = new Car("KIA K3"); // 객체 선언 car.turnLeft(); // 메소드 호출 } } 위와 같은 일반 Car 자바 객체를 빈으로 등록하기 위해서는 어떻게 해야 할까? 빈으로 .. 2023. 2. 3.
반응형