개발 공부용

[팀 프로젝트] 프로젝트 기록 #2 - CRUD, 매핑 본문

Project

[팀 프로젝트] 프로젝트 기록 #2 - CRUD, 매핑

솝제로 2023. 9. 25. 17:36

 

CRUD를 반복해서 작성하다 보니, 이제 간단한 CRUD는 무리 없이 작성할 수 있게 되었습니다.

어떤 공부든 반복이 최고의 학습법인 것 같다는 생각이 드는 요즘입니다. 🐻

 

이번 팀 프로젝트에도 사용자가 글을 작성해야 하는 부분이 있어 CRUD를 구현하게 되었는데요.

하나의 CRUD를 구현할 때 (예외 처리 부분을 제외하면)

Controller, Mapper, Entity, Dto, Repository, Service가 필요합니다.

 

@RestController
@RequestMapping("/")
@RequiredArgsConstructor
public class BlogController {
    private final BlogMapper blogMapper;
    private final BlogService blogService;

    //글 작성
    @PostMapping("blogs")
    public ResponseEntity postBlog (@LoginMemberId Long memberId,
                                    @Valid @RequestBody BlogPostDto blogPostDto) {
        Blog blog = blogService.createBlog(blogMapper.toBlog(blogPostDto), memberId);
        return new ResponseEntity(blogMapper.toBlogResponseDto(blog),HttpStatus.CREATED);
    }
    ...
}

 

이건 제가 작성한 BlogController의 일부를 약간 수정하여 가져온 것입니다.

이 Controller 안에 앞서 말한 6가지 요소가 필요한 이유가 담겨있는 것 같습니다.

 

1. BlogMapper와 BlogService를 DI 받았습니다.

2. postBlog() 메서드의 파라미터로 BlogPostDto를 받고 있습니다.

3. blogMapper의 toBlog() 메서드로 BlogPostDto 객체를 Blog 객체로 변환시켜 주었습니다.

4. 변환시킨 객체를 blogService의 createBlog() 메서드에 argument로 넣어 새 blog 객체를 생성해주고 있습니다.

5. createBlog() 메서드에는 BlogRepository에 생성한 객체를 저장하는 로직이 포함되어 있어 객체가 저장됩니다.

6. 이번에는 blogMapper의 toBlogResponseDto() 메서드를 이용해 blog를 응답에 필요한 정보를 모두 담은  BlogResponseDto 객체로 변환해 줍니다.

7. BlogResponseDto 객체를 반환합니다.

 

이런 식으로 하나의 blog를 작성하고 저장할 때 Controller, Mapper, Entity, Dto, Repository, Service가 모두 사용됩니다.

 

 


 

@Getter
@Setter
@Entity
public class Blog extends Auditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private String body;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

}

 

이건 Blog 엔티티 클래스입니다. 엔티티 클래스는 DB의 테이블이 됩니다.

엔티티 클래스에는 @Id가 꼭 필요합니다.

@Id는 해당 필드가 기본키 열이라는 것을 알려주는 애너테이션입니다.

 

@GeneratedValue(strategy = GenerationType.IDENTITY) 애너테이션으로 DB에 기본키 생성을 위임했습니다.

저는 DB로 MySQL을 이용해서, 기본키 매핑 전략으로 AUTO_INCREMENT를 선택했습니다.

(기본키 매핑 전략에는 IDENTITY, SEQUENCE, TABLE, AUTO가 있습니다.)

 AUTO_INCREMENT는 DB에 저장되는 순서대로 1부터 2, 3, 4 ... 와 같이 PK가 부여되는 전략입니다.

 

엔티티 간의 연관 관계 매핑에 이 기본키가 다른 엔티티의 외래키로서 역할하게 됩니다.

지금 Blog 엔티티는 Member 엔티티와 @ManyToOne으로 매핑되어 있는 상태입니다.

여러 개의 blog 글을 한 명의 멤버가 작성할 수 있기 때문입니다.

 

 

제대로 매핑이 되면 인텔리제이에서 파란색 동그라미 안쪽과 같이 표시가 되어 확인할 수 있습니다. 

 

매핑하다 보면 @ManyToOne인지 @OneToMany인지 헷갈리게 되는데,

현재 작성하는 중인 클래스를 기준으로 생각하면 됩니다.

 

Member 엔티티클래스에서는 한 명의 멤버가 여러 개의 글을 작성할 수 있으니 @OneToMany입니다.

Blog 엔티티 클래스에서는 여러 개의 글을 한 명의 멤버가 작성할 수 있으니 @ManyToOne입니다.

 

 

 


 

프로젝트 기간에는 아무래도 코드 작성하기 바쁘다 보니 블로깅이 늦어졌습니다.

이제 어느 정도 마무리가 되어 작업한 내용을 천천히 정리해 볼 생각입니다.

아직 공부하는 학생이다 보니, 잘못 이해한 부분이 있을 수 있는데 지적해 주시면 감사하겠습니다.