240523
오늘의 학습
● 1. 3 계층 분리
● 2. JPA 핵심
● 3. JPA 관계
3 Layer Architecture
서버 개발자들은 요청에 대한 처리 과정으로 Controller, Service, Repository 3개의 클래스로 분리하였다.
이유는 Controller에서의 처리가 많아져서 가독성과 유지보수가 불편했었고 이를 해결하기 위한 방법이
3 Layer Architecture 즉, 3계층 분리를 통해 유지보수성과 가독성을 높이게 되었다.
Spring Web Project에서의 3계층 분리
1. Controller
클라이언트의 요청을 받고 요청에 대한 로직 처리는 Service에게 전담을 한다.
요청에 대한 값이 존재하는지와 올바른 요청인지를 판단하는 역할을 하는 것 같다.
2. Service
사용자의 요구사항을 처리하는 비즈니스 로직을 관리하는 곳이다.
DB 저장 및 조회가 필요한 경우 Repository에게 요청을 한다.
ex) 게시글 저장의 추가적인 작업이 필요한 경우 여기서 처리를 한다.
3. Repository
DB 관리 및 연결 , 해제, 자원 관리 등등을 맡아서 한다.
DB의 CRUD의 작업을 처리한다.
JPA 핵심 기능
1. 1차 캐시
- 영속성 컨텍스트의 내부에 존재하는 1차 캐시 저장소
엔티티 em.persist를 통해 객체를 영속성 상태로 바꾸면 영속성 컨텍스트 내부의 1차 캐시 저장소에 저장이 된다.
엔티티를 조회를 해오는 경우에는 영속성 컨텍스트 내부의 1차 캐시 저장소에서 엔티티가 존재하는지 먼저 찾게되며
엔티티가 존재할 경우 그대로 반환을 해준다. 만약 엔티티가 존재하지 않을 경우 DB에 조회를 해서 엔티티를 자동으로
영속상태로 바꾸고 영속성 컨텍스트 내부의 1차 캐시 저장소에 저장을 하게 된다.
2. 쓰기 지연 저장소
SQL을 모아서 한번에 DB에 반영할 수 있게 도와주는 공간
JPA commit을 진행하면 쓰기 지연 저장소의 SQL을 한번에 요청을 하게 된다.
3. flush
트랜잭션 커밋 된 다음 추가적인 동작이 존재한다 flush
영속성 컨텍스트의 변경 내용 DB에 반영하는 역할을 한다.
쓰기 지연 저장소의 SQL을 DB에 요청하는 역할을 하는 것이다.
즉, flush를 사용하면 바로 반영이 된다.
4. 변경 감지
1차 캐시 저장소에는 Id와 Entity 그리고 LoadedState가 존재한다. LoadedState가 변경된 내용이 들어가고
Entity와 LoadedState를 비교하고 반영한다. flush가 호출되고 확인한다.
5. @Transactional
JPA에서 트랜잭션을 도와주는 애너테이션이다.
트랜잭션이란 작업단위이며 쉽게 말하면 DB의 작업을 수행한 후 Commit을 하게되는데 그 일련의 과정이라고
말할 수 있다. @Transactional은 JPA의 영속성 컨텍스트에 올라간 작업단위를 메서드 단위로 처리해준다.
JPA 공부해야 하는 키워드
@OneToOne : 1:1 관계를 맺어주는 역할
@ManyToOne : N:1 관계를 맺어주는 역할
@OneToMany : 1:N 관계를 맺어주는 역할
@ManyToMany : N;M 관계를 맺어주는 역할
단방향
양방향
N:1 의 양방향일 경우
외래키 주인 테이블 @ManyToOne 주인이 아닌 테이블 @OneToMany
이유는 양방향이기 때문에 서로를 참조하는 것이 가능하다.
테이블은 항상 양방향 JPA 엔티티 관계에서는 단방향 양방향 설정이 가능하다. 외래키는 무조건 N이다.
# 오늘의 회고
오늘은 앞으로 있을 프로젝트에 대해 팀과 회의를 진행을 하였다.
진행할 프로젝트에 대한 정보를 아직은 몰라서 기본적으로 가져가야 할 것들을 위주로 정하게 되었다.
1. 프로젝트의 코드 네이밍 컨벤션은 뭘로 정할 것인가?
2. 데이터베이스의 ERD 툴은 어떤걸 사용할 것인가?
3. 와이어프레임은 어떤걸 사용할 것인가?
에 대한 내용으로 회의를 진행하였다. 회의를 통해 정해진 부분은
1. 네이밍 컨벤션은 밑의 표와 같이 진행하기로 정했다.
종류
|
설명
|
예시
|
package
|
모두 소문자, 한 단어
|
example
|
class
|
파스칼 케이스
|
ExampleTest
|
interface
|
파스칼 케이스
|
ExampleTest
|
method
|
카멜 케이스
|
exampleTest
|
variable
|
카멜 케이스
|
exampleTest
|
constant
|
모두 대문자, 문자 사이는 언더바(_) 사용
|
EXAMPLE_TEST
|
boolean
|
앞에 is를 붙이고, 파스칼 케이스
|
isExampleTest
|
2. ERD툴은 ERD 클라우드를 이용하기로 정하게 되었다.
3. 와이어프레임은 피그마를 이용하기로 정하게 되었다.
내일도 파이팅.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 28일차 TIL - Filter (0) | 2024.05.27 |
---|---|
내일배움캠프 27일차 TIL - JWT (0) | 2024.05.24 |
내일배움캠프 25일차 TIL - 외래키 (1) | 2024.05.22 |
내일배움캠프 24일차 TIL - Generic Static Method (0) | 2024.05.21 |
내일배움캠프 23일차 TIL - JVM (0) | 2024.05.20 |