Spring을 프레임워크를 이용한 백엔드 개발을 진행하고 있습니다.
오늘은 제가 진행한 내용을 기록하고자 합니다.
먼저 dto와 Entity를 먼저 설계하고 Reposiroty와 Service를 구현하고 Controller를 사용해서 클라이언트와 API 통신을 할 겁니다.

먼저 ReviewDto를 살펴 보면
어노테이션들이 여러 개를 설정했습니다.
@Getter와 @Setter는 각 필드의 get 메서드와 set 메서드를 Spring이 자동으로 만들어 주는 기능을 합니다.
그래서 따로 제가 코드를 작성할 필요가 없어 간편하고 길게 코드를 쓰지 않아도 됩니다.
@NoArgsConstructor는 매개변수 없는 기본 생성자를 자동으로 생성해 주는 어노테이션입니다.
@AllArgsConstructors는 클래스 내 모든 필드를 매개변수로 받는 생성자를 자동으로 생성하는 어노테이션입니다.
@Builder는 빌더 패턴을 쉽게 구현할 수 있도록 도와주는 어노테이션입니다.
필드를 체인 방식으로 설정하며 객체를 생성할 수 있는 빌더클래스를 자동 생성합니다. 가독성과 유지보수성을 향상하는데 유용합니다.

저는 Dto 클래스 안에 Entity를 Dto로 변환하는 메서드를 만들었습니다.
장점 태그와 단점 태그 두 개가 따로 필요해서 나눴고, Review테이블과 Tag테이블을 연결해 주는
테이블인 ReviewTagMaps 테이블 Entity에서 pk를 찾고 있으면 빌더 패턴을 사용해서 각 태그 변수에 넣어 줍니다.
여기서 Stream를 사용했습니다.
Java의 Stream API는 선언형 프로그래밍 방식으로 기존의 반복문 대신 필터링, 매핑, 정렬 등을 연속된 연산 체인으로
간결하게 표현할 수 있습니다.
1. map()
- Stream 내의 각 요소를 내가 원하는 형태로 변환하는 중간 연산입니다.
- ex) .map(ReviewTagMap::getTag) // ReviewTagMap 객체에서 getTag()로 Tag 객체만 추출
2. filter()
- 원하는 조건(Boolean)에 따라 Stream의 요소를 선별해서 남기는 역할을 합니다.
- ex) .filter(tag -> tag.getTagStatus().equals("장점")) // 추출한 Tag 객체에서 getTagStatus()가 "장점"인 것만 남기고 나머지는 버립니다.
3. collect()
- 가공한 Stream의 요소들을 다시 List, Set등의 컬렉션으로 수집하는 최종연산입니다.
- ex) .collect(Collectors.toList()) // Stream에 남아있는 요소들을 모두 List로 변환해서 저장합니다.

그리고 이미지 관련 dto 또한 Stream를 사용해서 toDTO 메서드를 꺼내오고 List로 만들어 줍니다.
마지막으로 빌더 패턴을 사용해서 Entity를 dto로 변환해줍니다.

@Entity는 JPA 엔티티 클래스임을 명시합니다. 데이터베이스 테이블과 1대 1로 매핑이 됩니다.
@Table(name = "review") 클래스가 매핑될 DB 테이블 이름을 지정하고 없으면 클래스명이 테이블명으로 사용됩니다.
@EntityListeners(AuditingEntityListener.class)는 Auditing 기능(생성일, 수정일) 자동 입력을 활성화합니다.
@Id 테이블의 기본키와 매핑될 필드입니다. 반드시 있어야 합니다.
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "review_seq_gen")
이 어노테이션은 PK 값을 자동 생성 전략을 지정합니다. 시퀀스를 사용하여 PK 값을 생성합니다.
@SequenceGenerator는 시퀀스 객체의 이름과 실제 DB 시퀀스를 필요로 하고 설정을 합니다.
@Column 매핑되는 DB 컬럼 설정. 이름 길이 등 여러 속성을 상세히 지정할 수 있습니다.
@Lob Large Object 타입에 사용하며 긴 텍스트나 대용량 데이터를 다룰 때 사용합니다.
@ManyToone(fetch = FetchType.LAZY) 다대일 관계 매핑으로 여기서는 Review가 OrderOtem 하나만 참조한다는 의미입니다.
LAZY는 실제 값이 필요할 때만 DB에서 데이터를 불러온다는 의미입니다.
@JoinColumn(name = "orderItemNo") FK 외래키 컬럼의 이름 지정을 합니다. 이 컬럼이 연결되는 관계의 데이터베이스 컬럼이 됩니다.

@OneToMany(mappedBy = "review", cascade = CascadeType.REMOVE) 일대다 관계 매핑으로 Review가 여러 ReviewTagMap과 ReviewImage를 가질 수 있고, cascade는 Review가 삭제될 때 관련 객체도 함께 삭제한다는 의미입니다.
@CreatedDate, @LastModifiedDate는 JPA Auditing에서 사용하며 각각 생성일, 수정일 자동 저장에 쓰입니다.

그리고 repository를 만들었습니다.

JpaRepository를 상속받아 사용하여 JPA를 사용합니다.
상속을 받으면 기본 CRUD 메서드를 가져다가 쓸 수 있고, 직접 선언을 안해도 됩니다.
저는 나중에 보면 확인하고 싶어서 주석 처리로 써놨습니다.
그리고 기본 제공 이외에 다른 메소드를 사용하고 싶으면 위 사진처럼 작성해서 사용을 하면 JPA가 자동으로 쿼리문을 작성합니다.
물론 직접 쿼리문을 작성해서 하는 방법도 있습니다.
'개발 > 백엔드' 카테고리의 다른 글
| 멀티캠퍼스 [현대 이지웰] Spring Boot 활용하여 기본 CRUD 기능 구현 (0) | 2025.12.01 |
|---|---|
| 멀티캠퍼스 [현대 이지웰] 인터페이스 기반 프로젝션이란? (0) | 2025.11.24 |
| 멀티캠퍼스 [현대 이지웰] Spring Security Login에 대해서 알아보자! (0) | 2025.10.21 |
| 멀티캠퍼스 [현대 이지웰] Spring에서는 로그인과 회원가입을 어떻게 사용할 수 있을까? (0) | 2025.10.13 |
| 멀티캠퍼스 [현대 이지웰] REST와 REST API란?? (0) | 2025.09.30 |