https://start.spring.io/
위의 사이트는 spring 프로젝트를 간단하게 환경설정 후 생성할 수 있는 기능을 제공해준다.
Gradle에 java를 할 것이기 때문에
kotlin이 아닌 Groovy를 선택한 후,
2.7버전에서 스냅샷이 아닌 안정된 버전을 선택해준다.
dependencies 들은 4개를 추가해준다:
Spring Web, Lombok, MySQL Driver, Spring Data JPA
그 다음 generate 버튼을 누르면 해당 zip 파일이 다운로드되면서 뜬다.
zip 파일의 압축을 푼 후,
IntelliJ에서 해당 프로젝트 파일을 열어주면
새로운 프로젝트 파일을 열 수 있다.
이제 SpringBoot 프로젝트로 돌아와서,
IntelliJ에서 필요한 플러그인을 설치한다.
내가 설치한 플러그인은 'Atom Material Icons'이다.
설정 - 플러그인 - 마켓플레이스에서 필요한 플러그인을 검색하여 설치해준다.
우선 umc.spring 밑에 동그라미 친 패키지들을 만들어준다.
JPA에서 사용하기 위한 엔티티 클래스를 저장하기 위한 패키지
http 요청이 오면, 그에 대한 응답을 주는 클래스의 모임이다.
응답을 주기 위한 과정들을 service 단에서 처리하게 한다.
비즈니스 로직이 필요한 클래스들의 모임이며, 복잡한 코드가 들어간다.
controller에서 service의 메소드를 호출하게 되며,
service는 repository의 메소드를 호출하게 된다.
database와 통신을 하는 계층으로,
해당 프로젝트에서는
Spring Data JPA를 이용하여 만든 repository를 이용한다.
클라이언트가 body에 담아서 보내는 데이터를 받기 위한 클래스,
혹은 Database에서 받아온 데이터를 클라이언트에게 보여주기 위한 클래스이다.
Database에서 받아온 데이터(엔티티)를 그대로 응답으로 주게 되면 문제가 발생한다.
요구사항의 변경이 생겨 Database table의 설계가 바뀌게 되어 엔티티의 변경이 발생했을 때,
엔티티를 그대로 응답으로 줄 경우 Database의 변경사항이 프론트엔드 개발자에게까지 영향을 주게 된다.
이와 같은 설계는 좋지 않으므로,
dto를 통해 응답 데이터를 결정하게 만들어 Database의 변경이 생길 경우 dto만 변경하면 되도록 설계를 해준다.
converter은 데이터 형식 간의 변환을 수행하는 역할이다.
즉, entity to dto를 해야 하는 것이다.
repository에서 받아온 엔티티를 dto로 바꾸는 과정을 수행하는 것이 바로 converter이다.
추가로 entity의 생성 또한 converter가 도맡아 하기도 한다.
converter에서 entity의 생성을 하지 않고, service에서 하는 경우도 있다.
converter에서 엔티티의 생성을 하게 되면, service는 순수하게 비즈니스 로직에만 집중할 수 있게 되어 단일 책임의 원칙(SRP)의 측면에서 더 좋다.
converter에서 entity를 생성하는 것이 좋다.
1. service에서 dto 생성
service에서 converter을 통해 dto를 controller에게 리턴해주는 것으로,
controller에서는 dto를 그저 응답으로 주기만 해도 되고,
2. controller에서 dto 생성
service에서 entity를 리턴하고,
controller에서 converter을 통하여 dto를 만들어 응답으로 주기도 한다.
(github action을 위한 디렉토리는 추후에 추가될 예정이다.)
domain 패키지에서 entity를 매핑하는 것에 집중하여보자.
application.yml
설정하기// 로컬 DB이용(mysql)
spring:
datasource:
url: jdbc:mysql://zipdabang-db.claedpluhwyw.ap-northeast-2.rds.amazonaws.com:3306/study
username: 님들의 rds 루트 유저 이름
password: 님들의 rds 비밀번호
driver-class-name: com.mysql.cj.jdbc.Driver
sql:
init:
mode: never
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
show_sql: true
format_sql: true
use_sql_comments: true
hbm2ddl:
auto: update
default_batch_fetch_size: 1000