3. 실습
(1) DTO (Data Transfer Object)
- 계층 간 데이터 교환을 위해 사용하는 객체
- 불필요한 의존성을 방지하고, 비즈니스 로직을 보호하기 위해 사용
-> 프론트가 DTO로 데이터를 넣어주면, 백은 그 DTO 데이터를 엔티티에 넣어서 저장함.
-> 백이 엔티티에서 DTO로 데이터를 넣어주고 json으로 프론트한테 보내줄 수 있음
-> 필요한 데이터만 깔끔하게 전달 가능
-> 민감 정보 노출 문제 해결
-> 엔티티와 DTO는 1:1 대응하거나 일부만 대응.
-> 엔티티는 DB용, DTO는 네트워크/계층 간 데이터 전달용
-> 엔티티와 DTO는 변환 로직을 통해 연결됨
- MemberFormDto 생성
package com.likelion13th.shop.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;
@Getter @Setter
public class MemberFormDto {
@NotBlank(message = "이름은 필수 입력 값입니다.")
private String name;
@NotBlank(message = "이메일은 필수 입력 값입니다.")
@Email
public String email;
@NotBlank(message = "비밀번호는 필수 입력 값입니다.")
@Length(min = 8, max = 16, message = "비밀번호는 8자 이상, 16자 이하로 입력해주세요.")
public String password;
@NotBlank(message = "주소는 필수 입력 값입니다.")
public String address;
}
- Member 엔티티에 엔티티 생성 메소드 추가 (아래 코드)
// 올바르게 클래스 내부에 위치
public static Member createMember(MemberFormDto memberFormDto, PasswordEncoder passwordEncoder) {
Member member = new Member();
member.setName(memberFormDto.getName());
member.setEmail(memberFormDto.getEmail());
String pwd = passwordEncoder.encode(memberFormDto.getPassword());
member.setPassword(pwd);
member.setRole(Role.USER);
member.setAddress(memberFormDto.getAddress());
return member;
}
- Member 엔티티를 DB에 저장하기 위한 MemberRepository 생성
package com.likelion13th.shop.repository;
import com.likelion13th.shop.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findByEmail(String email);
}
(2) 회원가입 기능 테스트
package com.likelion13th.shop.repository;
import com.likelion13th.shop.constant.Role;
import com.likelion13th.shop.entity.Member;
import jakarta.transaction.Transactional;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
@SpringBootTest
@Transactional
@TestPropertySource(locations = "classpath:application.properties")
@Slf4j
@ToString
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
@DisplayName("회원가입 테스트")
void saveMemberTest() {
// Member 객체 생성
Member member = new Member();
member.setName("김민서");
member.setEmail("alstj@example.com");
member.setPassword("password123");
member.setAddress("경기도 남양주시");
// 저장
memberRepository.save(member);
// 출력 (toString 자동 호출됨)
System.out.println(member.toString());
}
}'멋쟁이사자처럼 13기 > 정기 세션' 카테고리의 다른 글
| [멋사/Mac OS] 5주차 정기 세션 (Part 2. JPA 쿼리 작성 방법) (0) | 2025.06.20 |
|---|---|
| [멋사/Mac OS] 5주차 정기 세션 (Part 1. 실습환경 세팅) (0) | 2025.06.20 |
| [멋사/Mac OS] 4주차 정기 세션 (Part 2. 엔티티 설계) (0) | 2025.06.18 |
| [멋사/Mac OS] 4주차 정기 세션 (Part 1. JPA) (0) | 2025.06.17 |
| [멋사/Mac OS] 3주차 정기 세션 (Part 3. 데이터베이스 기초 및 설계) (0) | 2025.06.09 |