Spring 6

[Spring Boot] Testing (Kotest + Mockk)

일반적으로 Java + Spring 에서 Test 코드 작성은 Junit + Mockito를 이용한다. Junit 은 Java로 Test를 수행할수있게 해주는 Framework고 Mockito 는 Unit Test 수행시 Mocking 작업을 수행해주는 라이브러리다. 해당 프로젝트는 Kotlin으로 작업이므로 Junit -> Kotest Mockito -> Mockk 변경하여 작업을 진행했다. (사실 Kotlin에서도 Junit과 Mockito를 그대로 사용해도 되지만 Kotlin의 장점을 살리기 위해 대체하였다.) 테스트 종류 토비의 스프링 Test 파트에서는 저자는 모든 코드는 테스트 가능하다고했다. 하지만 엄격한 TDD 스타일로 테스트를 다 만들수는 없기에 나는 내가 작성한 비지니스 로직을 중점적으..

[Spring Boot] Exception Handling

Java 에서 오류는 Error, Exception이 존재한다. Error 는 StackOverflow 같이 시스템적인 문제인데, 이는 예상할수도 막을수도 없는 것들을 말한다. 그래서 이는 우리의 관심사가 아니다. Exception 우리가 눈여겨 봐야할것들은 Exception 이다. Java 에서는 특정한 Exception을 특별 관리한다. 그게 Checked Exception이다. Checked Exception 은 시스템 외부에서 발생하는 Exception이다. IOException, SQLException 같이 프로그래머의 잘못인 아닌, 시스템 밖에서 무언가 잘못되었을때 발생한다. 그래서 반드시 try-catch 문을 사용하거나 throws하여 compile 단계에서 오류를 관리해야한다. 그러나 예..

[Spring Boot] Custom Response (Http, Restful API)

해당 포스팅에서는 Response를 어떻게 처리할지 관한 포스팅이다. 먼저 계락적인 Http, Restful 에 관한 설명이다. HTTP 해당 프로젝트에서 기본적으로 응답은 HTTP 프로토콜을 기반으로 응답한다. HTTP 는 기본적으로 Header, Body, Method(요청), Path(요청), Version(요청) Status Code(응답) 으로 이루어져 있다. HTTP 자체만으로도 훌륭한 프로토콜이지만 현재의 웹에서는 Restful 아키텍처를 추가로 사용하여 데이터를 주고받는다. Restful API Restful 의 핵심은 Resource(자원)이다. Resource를 Method(GET, POST, PUT, DELETE, OPTION), URL(id 기반) 만으로 표현하는 방식이다. 다음은 ..

[Spring Boot] 기본 CRUD 구현 - 3 (비지니스 로직 구현, Service와 Repository, Dto와 Domain)

요구사항은 유저가 주문을 할수만 있으면 되서 간단하였다. 그러나 구현하면서 몇가지 고민사항이 생겼고 어떻게 해결했는지 서술하겠다. Service와 Repository의 관계 내가 생각하는 MVC 패턴에서의 역할은 다음과 같다. Controller - 엔드포인트의 역할로써 외부의 요청과 응답을 담당한다. Service - 비지니스 로직이 들어가야한다. Entity - 도메인 데이터를 표현하는 층으로, 데이터의 정합성을 보장해줘야한다. Repository - Entity의 물리적인 변화를 담당한다. 또한 Controller -> Service -> Repository 순으로 접근하기에 Service는 Controller를 Repository는 Service의 존재를 몰라야한다. 저번 포스팅에서도 기술했듯이 ..

[Spring Boot] 기본 CRUD 구현 - 2 (Entity 관계 설정)

기본 컨셉은 쇼핑몰이다. 유저가 주문을 하고 확인하는 기능을 만들예정이다. 기본적인 시나리오는 다음과 같다. 1. 유저가 상품을 주문할 수 있다. 2. 주문목록은 여러 목록과 갯수가 있다. ex) 사과 3개, 바나나 2개, 포도 5개 3. 유저가 주문 목록을 확인할 수 있다. Entity 관계 설정 Entity는 기본적으로 User와 Item 이 있다. 근데 유저 A가 사과를 주문할수도 있고 유저 B가 사과를 주문할수도 있다. 반대로 유저 A가 사과, 바나나, 포도도 구매할 수 있다. 그래서 유저와 아이템은 N:M 의 다대다 관계가 생성된다. 하지만 테이블 설계를 User 와 Item으로만 설정한다면 주문 목록에 대한 속성값 추가가 어렵게된다. 그래서 주문 테이블을 추가하기로했다. 하지만 여전히 주문과 ..

[Spring Boot] 기본 CRUD 구현 - 1 (셋팅)

기존의 CRUD 과정이 계속해서 반복되기에 전체 과정을 블로그로 남긴다. 기본 환경 - Kotlin (Java 11) - Spring Boot 2.7.16 - Gradle-Groovy Spring Initializer를 사용하여 생성했다. Dependency는 최소화하기위해 3개만 추가했다. - Spring Web - Spring Data JPA - H2 Database 이렇게 프로젝트를 생성했고 build.gradle 파일은 다음과 같다. import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id 'org.springframework.boot' version '2.7.16' id 'io.spring.dependency-management' ..