Controller
- 클라이언트의 요청을 받음
- 요청에 대한 로직 처리는 Service에게 전담
- Request 데이터가 있다면 Service에 같이 전달
- Service에서 처리 완료된 결과를 클라이언트에게 응답
Service
- 사용자의 요구사항을 처리 ('비즈니스 로직') 함
- 따라서 현업에서는 서비스 코드가 계속 비대해지고 있음
- DB 저장 및 조회가 필요할 때는 Repository에게 요청
- Service를 이해하기 위한 큰 틀
1. Client가 Request를 보냄(Ajax, Axios, fetch등..)
2. Request URL에 알맞은 Controller가 수신 받음 (@Controller ,@RestController)
3. Controller 는 넘어온 요청을 처리하기 위해 Service 를 호출
4. Service는 알맞은 정보를 가공하여 Controller에게 데이터를 넘김
5. Controller 는 Service 의 결과물을 Client 에게 전달
Service가 알맞은 정보를 가공하는 과정을 '비즈니스 로직을 수행한다.' 라고 함
Service가 비즈니스 로직을 수행하고 데이터베이스에 접근하는 DAO를 이용해서 결과값을 받아 옴
DAO
- MySql 서버에 접근하여 SQL문을 실행할 수 있는 객체
- 단순하게 페이지를 불러오고 DB정보를 한 번에 불러오는 간단한 프로젝트의 경우 Service와 DAO는 차이가 거의 없다고 볼 수 있음
DAO & JPA
- pring Data JPA는 매우 적은 코드로 DAO를 구현할 수 있도록 해줌
- 인터페이스를 만드는 것 만으로도 Entity (@Entity)클래스에 대한 insert, Update, Delete, Select 를 실행할 수 있도록 해줌
- 인터페이스에 메소드를 선언하는 것 만으로 라이트한 쿼리를 수행하는 코드를 만드는것과 동등한 작업을 수행
- 하지만 JPA가 만들 수 있는 코드는 매우 가볍고 쉬운 쿼리를 대체하는 것이라서 복잡도가 높아지면 사용하기가 매우 어려움
- 그래서 JPA를 깊게 공부를 해서 JPA로 복잡도가 높은 쿼리를 짜거나 아니면 복잡도가 높은 곳은 DAO로 같이 사용
Repository
- Entity에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스
- @Entity라는 어노테이션으로 데이터베이스 구조를 만들었다면 여기에 CRUD를 어떻게 할 것인지 정의해주는 계층
- JpaRepository를 상속받도록 함으로써 기본적인 동작이 모두 가능해짐
- paRepository는 어떤 엔티티를 메서드의 대상으로 할지를 다음 키워드로 지정
- JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>.
Client <-dto-> controller(web) - service - repository(JPA) <-domain(entity)-> DB
@ 어노테이션
- @Entity : 클래스 위에 선언하여 이 클래스가 엔티티임을 알려줌, JPA에서 정의된 필드들을 바탕으로 데이터베이스에 테이블을 만들어줌
- @Builder : 해당 클래스에 해당하는 엔티티 객체를 만들 때 빌더 패턴을 이용해서 만들 수 있도록 지정해주는 어노테이션, 나중에 다른 곳에서 Board.builder(). {여러가지 필드의 초기값 선언 }. build() 형태로 객체를 만들 수 있음
- @AllArgsConstructor : 선언된 모든 필드를 파라미터로 갖는 생성자를 자동으로 만들어줌
- @NoArgsConstructor : 파라미터가 아예없는 기본생성자를 자동으로 만들어줌
- @Getter : 각 필드값을 조회할 수 있는 getter를 자동으로 생성
- 예를들어 다른 파일에서 Board 객체의 title값을 얻고 싶다면 getTitle() 메서드를 정의해서 해당 객체의 title값을 얻어오게 되는데, 해당 메서드를 굳이 작성하지 않아도 자동으로 생성해 줌.
- @ToString : 해당 클래스에 선언된 필드들을 모두 출력할 수 있는 toString 메서드를 자동으로 생성할 수 있도록 해줌
- @Id : 해당 엔티티의 주요 키(Primary Key, PK)가 될 값을 지정
- @GeneratedValue : 이 PK가 자동으로 1씩 증가하는 형태로 생성될지 등을 결정
- @ManyToOne : 해당 엔티티와 다른 엔티티를 관계짓고 싶을 때 쓰는 어노테이션
'🗂️ Study > 🌿Spring' 카테고리의 다른 글
IoC Container & Bean (0) | 2024.05.21 |
---|---|
IoC(제어의 역전) & DI(의존성 주입) (0) | 2024.05.21 |
JDBC (0) | 2024.05.21 |
Memo (CRUD 구현하기) (0) | 2024.05.21 |
DTO (0) | 2024.05.21 |