3계층 구조에 대해서 처음에는 어렵게 다가왔다.
하지만 점차 여러번 접하다보니 생각보다 쉽고 정말 편리하다는 생각이 들었다.
3계층 구조는 Controller, Service, Repository로 이루어져있다.
이를 이용하기 위해 Entity와 dto클래스도 함께 만들어줘야한다.
이것까지가 한 세트로 생각하면 편하다.
@RestController // 컨트롤러 역할
@RequiredArgsConstructor // 필수 속성 지닌 생성자
public class Controller {
private final Service service;
// @{Http메서드}Mapping과 ResponseEntity를 이용해
요청과 응답을 dto를 통해 전달(to Service) 및 반환(to Client) 구조 구현 ...
}
@Service // 서비스 역할
@RequiredArgsConstructor // 필수 속성 지닌 생성자
public class Service {
private final Repository repository;
//@Transactional : 작업 단위(트랜잭션 내 작업 중 하나라도 실패 시 전체 실패)
Controller로부터 전달받은 dto를 repository를 통해 기능 구현
Controller가 요구하는 응답dto와 동일한 타입으로 변환 후 전달 ...
public interface Repository extends JpaRepository<Entity, IdDataType> {
// 추가적인 쿼리 메서드 구현 가능 ...
// JpaRepository : 레포지토리 역할
}
(Controller, Service, Repository의 import는 생략되있음)
@Getter // 게터 역할
@Entity // 엔티티 역할
@Table(name = "entities") // 테이블 역할
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자(접근제어자)
public class Entity {
@Id // 고유 식별자 PK
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 여러 속성, 생성자, 세터 ...
}
Request DTO
@Getter // 게터 역할
public class RequestDto {
// 요청에 필요한 속성들 ...
}
Response DTO
@Getter // 게터 역할
public class ResponseDto {
// 응답에 필요한 속성들, 이를 포함한 생성자 ...
}
위의 작업을 이루기 위해 의존성은 Lombok, Spring Web, Spring Data JPA, MySQL Driver를 선택했다.
application.properties 설정
spring.datasource.url=jdbc:mysql://localhost:3306/{데이터베이스명}
spring.datasource.username=root
spring.datasource.password=12345678
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
위를 통해 CRUD
Create, Read, Update, Delete를 구현하는 연습을 통해 구조의 이해를 배웠다.
점차 클래스들 간의 역할과 책임에 대해서 익숙해지는 경험이 채워졌다.
위에서도 말했듯이 처음에는 복잡해보이고, 뭐가 뭔지 잘 몰랐는데,
반복하다 보니 정말 필요한 것만 간략하게 있으면서 편리하게 작업을 도와준다는 생각이 들정도로 이해가 늘어갔다.