๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring

ํšŒ์›๊ฐ€์ž… DTO ๋งŒ๋“ค๊ธฐ

User Join DTO(Data transfer Object) ์ƒ์„ฑ

ํšŒ์›๊ฐ€์ž…์— ํ•„์š”ํ•œ DTO๋ฅผ ๋งŒ๋“ค์–ด ํšŒ์› ๋“ฑ๋ก์„ ํ•ด๋ณด์ž.

DTO(Data transfer Object)

DTO๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

DAO(Data Access Object)์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ž‘์—…์„ ์ „๋‹ดํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, Getter/Setter์™€ ์ƒ์„ฑ์ž ์™ธ์—๋Š” ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Entity ๊ฐ์ฒด

๋‹ค์Œ๊ณผ ๊ฐ™์€ Entity ๋ชจ๋ธ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

import lombok.*;

import javax.persistence.*;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
@Entity
public class User  extends CreateDateEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 100, unique = true)
    private String username;
    @Column(nullable = false, length = 100)
    private String nickname;
    @Column(nullable = false, length = 50)
    private String email;
    @Column(nullable = false, length = 100)
    private String password;

    @Enumerated(EnumType.STRING)
    private RoleType role;

    public void update(String password, String nickname, String email){
        this.password = password;
        this.nickname = nickname;
        this.email=email;
    }
}

ํšŒ์›๊ฐ€์ž…์„ ์œ„ํ•ด์„  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํšŒ์›๊ฐ€์ž…์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  ์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ํšŒ์› ์ •๋ณด๋ฅผ DB์— ์ €์žฅํ•ด ์ค€ ๋’ค ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๋•Œ, ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ Entit ๊ฐ์ฒด์ธ User.java๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

Entity ๊ฐ์ฒด๋Š” DB์™€ ๋งž๋‹ฟ์€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ๋ฒˆํ•œ ์ •๋ณด ๋“ฑ๋ก๊ณผ ์ˆ˜์ •์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  DTO๋ฅผ ๋งŒ๋“ค์–ด์ค˜์„œ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•ด ์ฃผ๋„๋ก ํ•˜์ž.

UserJoinDto

import com.vividswan.studymate.model.RoleType;
import com.vividswan.studymate.model.User;
import lombok.*;

@Data
@NoArgsConstructor
public class UserJoinDto {
    private String username;
    private String password;
    private String email;
    private String nickname;
    private RoleType role;

    @Builder
    public UserJoinDto(String username, String password, String email, String nickname, RoleType role){
        this.username = username;
        this.password = password;
        this.email = email;
        this.nickname = nickname;
        this.role = role;
    }

    public User toEntity(){
        return User.builder()
                .username(username)
                .password(password)
                .email(email)
                .nickname(nickname)
                .role(role)
                .build();
    }
}

ํšŒ์›๊ฐ€์ž…์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋Š” DTO๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

    private String username;
    private String password;
    private String email;
    private String nickname;
    private RoleType role;

User์—๊ฒŒ ์ง์ ‘ ๋ฐ›๋Š” ์ •๋ณด๋ฅผ ์†์„ฑ์œผ๋กœ ์„ ์–ธํ–ˆ๋‹ค.

    @Builder
    public UserJoinDto(String username, String password, String email, String nickname, RoleType role){
        this.username = username;
        this.password = password;
        this.email = email;
        this.nickname = nickname;
        this.role = role;
    }

Builder ํŒจํ„ด์„ ์ด์šฉํ•˜์—ฌ Dto๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

    public User toEntity(){
        return User.builder()
                .username(username)
                .password(password)
                .email(email)
                .nickname(nickname)
                .role(role)
                .build();
    }

User์—๊ฒŒ ๋ฐ›์€ ์ •๋ณด์™€ Builder ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ Dto ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ DB์— ์‚ฝ์ž…ํ•  Entity ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋ฆฌํ„ดํ•ด์ฃผ๋Š” toEntity ๋ฉ”์„œ๋“œ์ด๋‹ค.

Dto๋ฅผ ์ด์šฉํ•œ ํšŒ์›๊ฐ€์ž…

    @Transactional
    public boolean join(UserJoinDto userJoinDto) {
        String rawPassword = userJoinDto.getPassword();
        String encPassword = bCryptPasswordEncoder.encode(rawPassword);
        userJoinDto.setPassword(encPassword);
        userJoinDto.setRole(RoleType.USER);
        userRepository.save(userJoinDto.toEntity());
        return true;
    }

Service ์ธต์—์„œ ๊ฐ€์ž…ํ•  ํšŒ์›์ •๋ณด๋ฅผ Repository ์ธต์— ์ „๋‹ฌํ•ด ์ค€๋‹ค.

ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋„˜์–ด์˜จ dto์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ์˜ ํ•ด์‹œ ์•”ํ˜ธํ™”๋ฅผ ํ•ด์ฃผ๊ณ , User์˜ Role์„ ์ง€์ •ํ•œ ๋’ค, toEntity๋กœ Dto์˜ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ๋œ Entity ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด ๋ฐ›์€ ๋’ค, Repository ์ธต์—์„œ DB์— ํšŒ์›์ •๋ณด๋ฅผ ์ €์žฅํ•ด ์ค€๋‹ค.