Entity
: 데이터베이스에 저장되는 객체로, 데이터베이스와 직접 연결
DTO
: 클라이언트와 서버 간 데이터 전송을 위해 설계된 객체
(+) 웹 동작 과정 process
=> Service단
Controller
Service
Post
@Table(name = "post")
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@AllArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String title;
@Column
private String nickname;
@Column
private String content;
@Column
private int view_;
public void update(String title, String content) {
if (title != null){
this.title = title;
}
if (content != null){
this.content = content;
}
}
}
PostDTO
@Getter
public class PostDTO {
private Long id;
private String title;
private String nickname;
private String content;
private int view;
public PostDTO(Post post){
this.id = post.getId();
this.title = post.getTitle();
this.nickname = post.getNickname();
this.content = post.getContent();
this.view = post.getView_();
}
}
PostCreateRequest
@Builder
@Getter
public class PostCreateRequest {
private String title;
private String nickname;
private String content;
}
PostReadResponse
@Builder
@Getter
public class PostReadResponse {
private String title;
private String nickname;
private String content;
private int view;
}
PostUpdateRequest
@Builder
@Getter
public class PostUpdateRequest {
private String title;
private String content;
}
(테스트를 위한 더미 데이터)
PostController
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class PostController {
private final PostService postService;
// create
@PostMapping("/posts")
public ResponseEntity<PostDTO> create(@RequestBody PostCreateRequest request){
PostDTO dto = postService.create(request);
return ResponseEntity.ok(dto);
}
}
PostService
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
public PostDTO create(PostCreateRequest request) {
Post post = Post.builder()
.title(request.getTitle())
.content(request.getContent())
.nickname(request.getNickname())
.build();
return new PostDTO(postRepository.save(post));
}
}
PostController
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class PostController {
private final PostService postService;
// update
@PutMapping("/posts/{id}")
public ResponseEntity<PostDTO> update(@PathVariable Long id, @RequestBody PostUpdateRequest request){
PostDTO dto = postService.update(id, request);
return ResponseEntity.ok(dto);
}
}
PostService
입력 데이터:
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
public PostDTO update(Long id, PostUpdateRequest request) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 게시글x, id = " + id)
);
post.update(request.getTitle(), request.getContent());
return new PostDTO(postRepository.save((post)));
}
}
PostController
read()
readAll()
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class PostController {
private final PostService postService;
// read
@GetMapping("/posts/{id}")
public ResponseEntity<PostReadResponse> read(@PathVariable Long id){
PostReadResponse dto = postService.read(id);
return ResponseEntity.ok(dto);
}
// readAll
@GetMapping("/posts")
public ResponseEntity<List<PostReadResponse>> readAll(){
List<PostReadResponse> dtoList = postService.readAll();
return ResponseEntity.ok(dtoList);
}
}
PostService
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
public PostReadResponse read(Long id) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 게시글x, id = " + id)
);
PostReadResponse response = PostReadResponse.builder()
.title(post.getTitle())
.content(post.getContent())
.nickname(post.getNickname())
.view(post.getView_())
.build();
return response;
}
public List<PostReadResponse> readAll() {
List<Post> postList = postRepository.findAll();
List<PostReadResponse> responseList = postList.stream().map(post -> PostReadResponse.builder()
.title(post.getTitle())
.content(post.getContent())
.nickname(post.getNickname())
.view(post.getView_())
.build())
.collect(Collectors.toList());
return responseList;
}
}
read()
readAll()
PostController
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class PostController {
private final PostService postService;
// delete
@DeleteMapping("/posts/{id}")
public ResponseEntity<PostDTO> delete(@PathVariable Long id){
PostDTO dto = postService.delete(id);
return ResponseEntity.ok(dto);
}
}
PostService
@Service
@RequiredArgsConstructor
public class PostService {
private final PostRepository postRepository;
public PostDTO delete(Long id) {
Post post = postRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("해당 게시글x, id = " + id)
);
postRepository.delete(post);
return new PostDTO(post);
}
}