멋쟁이사자처럼 13기/정기 세션

[멋사/Mac OS] 4주차 정기 세션 (Part 3. 실습)

개발자 지망생 리네 2025. 6. 18. 21:36

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());
    }
}