Domain 패키지는 도메인을 담을 수있는 패키지
ex) 댓글, 회원 정산 결제등 소프트웨어에 대한 요구사항 혹은 문제영역
Post 클래스에는 한가지 특이점 Setter 메소드가 없다.
게시글(Post) 엔티티 클래스에서 Setter 메소드를 제공하지 않는 이유는 다음과 같습니다.
- 불변성(Immutability)
Setter 메소드를 제공하면 해당 필드 값을 외부에서 언제든지 변경할 수 있습니다. 그러나 게시글 정보는 한 번 저장되면 대부분 변경되지 않기 때문에 불변성을 유지하는 것이 좋습니다. 따라서 Setter 메소드를 제공하지 않아 게시글 정보가 변경되는 것을 방지할 수 있습니다.
- 캡슐화(Encapsulation)
엔티티 클래스에서는 객체 지향의 캡슐화(Encapsulation) 원칙을 따르는 것이 좋습니다. 캡슐화란 객체의 상태와 행위를 하나의 단위로 묶고, 외부에서 직접 접근하지 못하도록 제한하는 것을 말합니다. Setter 메소드를 제공하면 외부에서 객체의 상태를 직접 변경할 수 있으므로 캡슐화 원칙을 위반할 수 있습니다.
- 안정성(Safety)
Setter 메소드를 사용하면 객체의 상태를 언제든지 변경할 수 있으므로, 프로그래머가 의도하지 않은 값으로 객체의 상태를 변경할 수도 있습니다. 이는 프로그램의 안정성을 저하시킬 수 있습니다. Setter 메소드를 제공하지 않으면, 객체의 상태를 변경할 수 있는 방법이 제한되므로 안정성을 높일 수 있습니다.
따라서, 게시글(Post) 엔티티 클래스에서 Setter 메소드를 제공하지 않는 것이 좋습니다. 대신 생성자나 빌더 패턴을 사용하여 객체를 생성하고, Getter 메소드를 통해 필드 값을 읽어오는 것이 적절합니다.
Setter가 없을 때 값 채우는 방법
해당이벤트에 맞는 public 메소드를 호출하여 변경하는것을 전제로 함
@Buidler를 통해 제공되는 빌더 클래스 사용
package com.dawon.book.springboot.domain.posts;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@DataJpaTest
public class PostsRepositoryTest {
@Autowired
private PostsRepository postsRepository;
@After
public void cleanup() {
postsRepository.deleteAll();
}
@Test
public void Posts_저장하기_불러오기() {
//given
String title = "테스트 게시글";
String content = "테스트 본문";
String author = "테스트 작성자";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author(author)
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
assertThat(posts.getAuthor()).isEqualTo(author);
}
}
등록/수정/조회 API 만들기
- Request 데이터를 받을 DTO
- API를 요청받을 Controller
- 트랜잭션, 도메인 기능간의 순서를 보장하는 Service
Web Layer - 흔히 사용하는 컨트롤러와 jsp/freemaker 등의 뷰템플릿 영역입니다
이외에서 필터 인터셉터 어드바이스등 외부 요청과 응답에 대한 전반적 영역
Sevice Layer - @Service 서비스 영역
controller와 DAO 중간영역
@Transaciton
Repository Layer -Database 같이 데이터 저장소에 접근하는 영역
DTO
data transfer object 계층간에 데이터 교환을 위한 객체를 이야기하며 dto는 이들의 영역을 이야기함
'취업 준비 > 실전 JPA' 카테고리의 다른 글
4/7일 한일 (0) | 2023.04.07 |
---|---|
4월의 목표 (0) | 2023.04.06 |
직접 설계하여 작성 4/6 (0) | 2023.04.06 |
23.03.08[취준 일지] 혼자 구현하는 웹사이트 (0) | 2023.03.08 |
23.03.06[취준 일지] 혼자 구현하는 웹사이트 (0) | 2023.03.06 |