• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

객체 생성 관련 질문

24.01.01 01:14 작성 조회수 165

0

영한님 안녕하세요.

객체 생성과 관련한 내용으로 궁금한 점이 있어 작성하였습니다.

객체 생성시 크게 생성자, 빌더, 정적 메소드 3가지 방식으로 알고 있습니다.

  1. 영한님은 실무에서는 주로 어떤 방식을 선호하는지 궁금합니다.

  2. 정적 메서드와 빌더를 같이 사용하는건 어떤지 영한님 생각이 궁금합니다.

     

예시)

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@NamedEntityGraph(
        name = "Member.roles",
        attributeNodes = @NamedAttributeNode(value = "roles", subgraph = "Member.roles.role"),
        subgraphs = @NamedSubgraph(name = "Member.roles.role", attributeNodes = @NamedAttributeNode("role")))
public class Member extends EntityDate {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;

    @Column(nullable = false, length = 30, unique = true)
    private String email;

    private String password;

    @Column(nullable = false, length = 20)
    private String username;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private SocialType socialType;

    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<MemberRole> roles;

    @Builder
    public Member(String email, String password, String username, SocialType socialType, List<Role> roles) {
        this.email = email;
        this.password = password;
        this.username = username;
        this.socialType = socialType;
        this.roles = roles.stream()
                .map(r -> new MemberRole(this, r))
                .collect(toSet());
    }
}
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class MemberDto {

    private Long id;
    private String email;
    private String username;
    private SocialType socialType;
    private Set<RoleType> roles;

    @Builder
    public MemberDto(Long id, String email, String username, SocialType socialType, Set<RoleType> roles) {
        this.id = id;
        this.email = email;
        this.username = username;
        this.socialType = socialType;
        this.roles = roles;
    }

    public static MemberDto toDto(Member member) {
        return MemberDto.builder()
                .id(member.getId())
                .email(member.getEmail())
                .username(member.getUsername())
                .socialType(member.getSocialType())
                .roles(member.getRoles().stream()
                        .map(r -> r.getRole().getRoleType())
                        .collect(Collectors.toSet()))
                .build();
    }
}
@Getter
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class SignUpRequest {

    @Email(message = "이메일 형식을 맞춰주세요.")
    @NotBlank(message = "이메일을 입력해주세요.")
    private String email;

    @NotBlank(message = "비밀번호를 입력해주세요.")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$",
            message = "비밀번호는 최소 8자리아면서 1개 이상의 알파벳, 숫자, 특수문자를 포함해야합니다.")
    private String password;

    @NotBlank(message = "사용자 이름을 입력해주세요.")
    @Size(min = 2, message = "사용자 이름이 너무 짧습니다.")
    @Pattern(regexp = "^[A-Za-z가-힣]+$",
            message = "사용자 이름은 한글 또는 알파벳만 입력해주세요.")
    private String username;

    @Builder
    public SignUpRequest(String email, String password, String username) {
        this.email = email;
        this.password = password;
        this.username = username;
    }

    public Member toEntity(Role role, SocialType socialType, PasswordEncoder passwordEncoder) {
        return Member.builder()
                .email(email)
                .password(passwordEncoder.encode(password))
                .username(username)
                .socialType(socialType)
                .roles(List.of(role))
                .build();
    }
}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.01

안녕하세요, 인프런 AI 인턴입니다.

강의 수강생이신 yongc_2님께서 객체 생성 방식에 대해 궁금증을 가지고 계신 것으로 보입니다. 김영한 강사님께서 실무에서 객체 생성 방식에 대한 선호도 및 정적 메서드와 빌더를 함께 사용하는 것에 대한 의견을 여쭤보셨군요.

질문에 대한 세부 사항을 고려하여 김영한 강사님의 답변이 유용할 것으로 판단되는 관련 질문의 답변 URL을 찾아보았습니다.

아래의 링크는 비슷한 맥락으로 객체 생성 방식에 대해 설명되어 있으니 참고하시면 좋겠습니다.

위 링크들을 확인하시고, 여전히 질문이 남아 있다면 추가적인 질문을 게시판에 남겨주시면 강사님이 답변해주실 것입니다.