> For the complete documentation index, see [llms.txt](https://jinwon-yoon.gitbook.io/jinonys-blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jinwon-yoon.gitbook.io/jinonys-blog/daily-log/2023.01.20.md).

# 2023.01.20

## 할일 및 한일&#x20;

* [x] 운영체제 세미나 참여&#x20;
* [x] 스프링 부트 & JPA 강의 학습 및 정리&#x20;

## 경험 및 배움&#x20;

### 스프링 부트 & JPA 강의 학습 및 정리&#x20;

오늘은 주문 도메인을 개발해보았다.

**주문과 주문 상품 엔티티, 주문 리포지토리 및 서비스, 또한 검색 기능**을 개발해보았다.

우선, 지금까지 프로젝트를 하거나 학습할 때는 대부분 서비스 계층에서 비즈니스 로직을 처리하였다. 하지만, 이번 JPA 강의에서는 엔티티에서 대부분의 비즈니스 메서드를 작성하였다.

**엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것을 도메인 모델 패턴**이라고 하고, 반대로 엔티티에는 비즈니스 로직이 거의 없고 **서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을 트랜잭션 스크립트 패턴**이라고 한다고 한다.

또한, **JPA는 `protected` 가 붙으면 개발자에게 임의로 하지말라는 뜻을 가진 관례**라고 한다.

따라서, **`@NoArgsConstructor(access = AccessLevel.PROTECTED)`** 어노테이션을 클래스 레벨에 붙이면 기본 생성자에 `protected` 를 붙인 것과 동일하므로, **지정된 생성 메서드 로직 이외에는 사용하지 말라는 뜻**을 담고 있다고 한다.

마지막으로, 동적 쿼리를 JPA에서 구현할 때는 JPQL로 처리하는 법, JPA criteria로 처리하는 법들이 존재한다.

하지만 너무 복잡하고 가독성도 좋지 않아, 현업에서는 사용하지 않는다고 한다.

대신, **querydsl**을 사용하는데, 그건 나중에 학습해봐야겠다.

나머지 자세한 학습 내용은 다음과 같다.

{% embed url="<https://jinwonyoon.notion.site/313909ebf6d34aa8a4119b54489e34c1>" %}

## 개선 및 목표&#x20;

* 내일은 명절을 맞아 큰 집에 가는 날이다.&#x20;
* 틈틈히 개인 공부를 진행해보자.&#x20;
