> 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.23.md).

# 2023.01.23

일일 회고 159일차

## 할일 및 한일&#x20;

* [x] 스프링 부트 & JPA 강의 학습&#x20;
* [ ] JPA 강의 정리 및 PR&#x20;

## 경험 및 배움&#x20;

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

오늘은 프로젝트의 **웹 계층, 즉 컨트롤러가 존재하는 부분**을 구현해보았다.

부트스트랩을 이용하여 템플릿을 가져온 후, 실습 파일에 존재하는 html과 css를 추가하였다.

요구사항을 구현할 때, 강의에서는 엔티티에서 직접 데이터를 가져와서 사용하는 것이 아니라, 중간에 `Form` 을 두고 그것을 통해서 작업을 진행하였다.

그 이유는, 화면 요구사항이 복잡해지기 시작하면, 엔티티에 화면을 처리하기 위한 기능이 점점 증가한다고 한다. 결과적으로, **엔티티는 점점 화면에 종속적으로 변하고, 이렇게 화면 기능 때문에 지저분해진 엔티티는 결국 유지보수하기 어려워진다.**

따라서, **실무에서는 비즈니스 로직만 갖고 있고, 엔티티에 화면을 위한 로직(ex) 유효성 점검 등)은 없어야 한다.**

엔티티서 **직접적으로 데이터를 사용하지말고, 다음과 같이 폼 객체나 DTO를 사용해서 처리**해야 한다고 한다.

```java
@PostMapping("/members/new")
public String create(@Valid MemberForm form, BindingResult result) { // @Valid -> 유효성 검증 어노테이션을 이용해 검증해준다.

    if (result.hasErrors()) {
        return "members/createMemberForm";
    }

    Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode());

    Member member = new Member();
    member.setName(form.getName());
    member.setAddress(address);

    memberService.join(member);
    return "redirect:/"; // 첫 번째 페이지로 넘어감
}
```

**자세한 학습 내용을 정리한 링크는 다음과 같다.**

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

## 개선 및 목표&#x20;

* 내일은 남은 JPA 강의를 모두 마무리하자.&#x20;
