이번에는 게시글 삭제 기능을 구현해 보겠습니다. File 삭제 -> Post 삭제 -> Post Controller 요청 순으로 진행하겠습니다. File 삭제 LocalFileService @Override public void delete(String filename) { new File(location + filename).delete(); } 파라미터로 filename을 받아 file을 삭제합니다. Post 삭제 PostService @Transactional public void delete(Long id){ Post post = postRepository.findById(id).orElseThrow(PostNotFoundException::new); deleteImages(post.getImag..
이번에는 게시글 API 조회 기능을 구현해보겠습니다. PostRepository 게시글을 조회할때는 작성자의 정보도 포함해서 조회할 것이기 때문에 Post를 조회할 때 Member를 함께 조회하는 쿼리를 작성해줍니다. public interface PostRepository extends JpaRepository { @Query("select p from Post p join fetch p.member where p.id = :id") Optional findByIdWithMember(@Param("id") Long id); } 쿼리의 실행 결과는 Post Entity와 연관된 Member Entity를 함께 가져오며, 이를 통해 게시물과 회원 정보를 모두 조회할 수 있습니다. DTO 다음으로 데이터를 ..
이번에는 게시글 생성 기능을 구현해 보겠습니다. 서비스 로직부터 API생성까지 진행하겠습니다. DTO 먼저 서비스 로직을 요청할 때 필요한 요청클래스 PostCreateRequest와 반환클래스 PostCreateResponse를 만들어 보겠습니다. PostCreateRequest @ApiModel(value = "게시글 생성 요청") @Data @NoArgsConstructor @AllArgsConstructor public class PostCreateRequest { @ApiModelProperty(value = "게시글 제목", notes = "게시글 제목을 입력해주세요.", required = true, example = "my title") @NotBlank(message = "게시글 제목을 ..
이번에는 스프링 개발에 있어 필수적인 객체지향 설계 5가지 원칙인 SOLID를 가볍게 정리해보도록 하겠습니다. 객체지향 원칙이란? 객체지향 프로그래밍(OOP)은 소프트웨어 개발 방법 중 하나로, 현실 세계의 객체를 모델링하여 소프트웨어를 구현하는 방식입니다. 객체지향 프로그래밍에서는 데이터와 기능을 하나의 단위인 객체(object)로 묶어서 관리하며, 객체 간의 상호작용을 통해 프로그램을 구성합니다. SOLID 원칙의 정의와 목적 설명 객체지향 프로그래밍의 핵심 원칙으로는 SOLID 원칙이 있습니다. SOLID 원칙은 SRP, OCP, LSP, ISP, DIP 다섯 가지 원칙으로 구성되어 있으며, 각각 단일 책임 원칙, 개방-폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 역전 원칙을 의미..
Authorization 헤더에 access token 정보를 주고 API 요청을 보낼 때, Member를 조회하는 과정에서 불필요한 쿼리 호출이 이루어지는 부분을 살펴보고 Entity Graph를 적용해서 해결해 보도록 하겠습니다. JwtAuthenticationFilter @RequiredArgsConstructor public class JwtAuthenticationFilter extends GenericFilterBean { private final TokenHelper accessTokenHelper; private final CustomUserDetailsService userDetailsService; @Override public void doFilter(ServletRequest req..
Entity Graph란? Entity Graph는 JPA(Java Persistence API)에서 제공하는 기능으로, 엔티티 객체를 가져올 때 연관된 엔티티 객체들을 함께 가져오는 방법을 지정하는 기능입니다. 일반적으로 JPA에서는 지연 로딩(lazy loading) 방식을 사용하여 연관된 엔티티 객체를 필요할 때 가져옵니다. 그러나 이 경우에는 연관된 엔티티 객체를 가져오는 쿼리가 지연 로딩 수행 시 매번 실행되어 성능상의 이슈가 발생할 수 있습니다. Entity Graph는 이러한 성능상의 이슈를 해결하기 위해, 한 번의 쿼리로 필요한 모든 엔티티 객체를 함께 가져오기 위한 방법을 제공합니다. 따라서 연관된 엔티티 객체를 여러 번 가져오지 않아도 되므로 성능상의 이점을 얻을 수 있습니다. Enti..
프로젝트를 진행하면서 중간중간 수정 작업이 있었지만 대부분 게시글 주제와는 거리가 좀 있어 설명을 생략했습니다. 이번에 수정했던 부분들을 짚어보면서 개념 정리도 다시 해보고 로그인 기능 구현 후 Swagger로 API 추가 했던 작업을 카테고리에서도 동일하게 해보겠습니다. Entity 수정 먼저 Member와 Role 을 이어주는 MemberRole Entity를 수정하겠습니다. [Before] MemberRole @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter public class MemberRole { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id..
spring에서 지원하는 JPA에서는 각 Entity 클래스에서 기본 키(Primary Key, PK)를 지정해야 합니다. 이때, 복합적인 기본 키를 사용하는 경우가 있습니다. spring에서는 @IdClass 어노테이션을 사용하여 복합적인 기본 키를 지정할 수 있습니다. @IdClass @IdClass 어노테이션은 복합적인 기본 키를 사용하는 엔티티 클래스에서 기본 키를 정의할 때 사용됩니다. 이 어노테이션을 적용한 클래스는 복합 키를 구성하는 여러 필드를 포함하고 있습니다. 예를 들어, Person 클래스에서 id와 name 필드를 복합 키로 사용하려면, PersonId 클래스를 정의하고 이를 @IdClass 애노테이션으로 마크업합니다. public class PersonId implements Se..
spring이 지원하는 JPA에서는 여러 개의 Entity로 구성된 객체 모델을 관계형 데이터베이스 테이블로 매핑합니다. 이 때, 객체 모델의 필드 중에는 복합적인 값을 가지는 경우가 있습니다. 예를 들어서 Address라는 객체가 있는데, Address는 ciry, street, zipCode 필드로 구성됩니다. 이러한 복합적인 값을 가지는 필드를 매핑하기 위해 @Embeddable을 사용합니다. @Embeddable @Embeddable 애노테이션은 복합적인 값을 가지는 객체를 정의할 때 사용됩니다. 이 애노테이션을 적용한 클래스는 엔티티의 필드로 사용될 수 있습니다. 예를 들어, Address 클래스를 정의하고 이를 @Embeddable 애노테이션으로 마크업하면, 다른 엔티티 클래스에서 Addres..