스프링 부트에서 객체 생성을 위한 여러 방법들 간의 고찰

유동재·2024년 4월 6일
0

Spring Boot

목록 보기
1/7
post-thumbnail

스프링 부트에서 객체를 생성하는 방법을 여러가지가 존재한다.
예를 들자면 대부분의 웹 프로젝트에 존재할 회원 가입 api를 구현할 때 객체를 생성하는 경우를 예시로서 보겠다.

먼저 아래의 세 가지 방식은, 실제로 프로젝트를 진행하며 사용했던 대표적인 세 가지 방식이다.


1. Setter 방식

Member member = new Member();
member.setName("유동재");
member.setEmail("ydjLog@naver.com");
member.setPassword("ydjPassword123!");

위의 방식은 가장 단순한 방식으로 Setter를 사용하는 방식이다.
나머지 두 가지 방식으로는, @Builder를 사용하는 방식과, 정적 팩토리 메서드를 사용하는 방식이 존재하는데, 차례대로 보겠다.


2. @Builder 방식

@Builder
public Member(String name, String password, String email, String image, String address, String phoneNum, String nickName, String authority){
	this.name = name;
    this.password = password;
    this.email = email;
    this.image = image;
    this.address = address;
    this.phoneNum = phoneNum;
    this.nickName = nickName;
    this.authority = authority;
}

위 방식이 @Builder를 사용하는 방식이다.
엔티티(Entity) 클래스에 어노테이션과 함께 생성자를 정의하는 방식이다.


3. 정적 팩토리 메서드 방식

// 정적 팩토리 메서드
	public static Member createMember(String name, String email, String password){
		Member member = new Member();
    	member.name = name;
    	member.email = email;
    	member.password = password;
    	return member;
   	}
}

// 객체 생성
Member member = Member.createMember("유동재", "ydjlog@naver.com", "ydjPassword123",);
    

위 방식이 정적 팩토리 메서드를 사용하여 객체를 생성하는 방식이다.
엔티티 클래스에 객체 생성을 위한 정적 메서드를 따로 정의하고, 해당 메서드를 사용하여 서비스 클래스와 같은 곳에서 새로운 객체를 생성하는 것이다. 이때 해당 메서드를 정적 팩토리 메서드라고 부른다.


결론적으로 세 가지 방식들 사이에서 고민한 결과, @Builder 방식을 채택하여 사용중이다.

아래는 그 이유에 대하여 기술하겠다.

먼저 Setter 방식과 @Builder 방식을 비교하자면, 가독성의 차이가 너무 크다.

// Setter 방식
GoodsDetailDto goodsDetailDto = new GoodsDetailDto();
goodsDetailDto.setName("스마트폰");
goodsDetailDto.setPrice(1000000);
goodsDetailDto.setDescription("최신 모델 스마트폰");
goodsDetailDto.setStockQuantity(100);
goodsDetailDto.setManufacturer("스마트폰 제조사");
goodsDetailDto.setColor("블랙");
goodsDetailDto.setWeight(200);
goodsDetailDto.setOperatingSystem("안드로이드");
goodsDetailDto.setScreenSize(6.5);
goodsDetailDto.setBatteryCapacity(4500);
goodsDetailDto.setCameraResolution("108MP");
goodsDetailDto.setNetworkType("5G");
goodsDetailDto.setReleaseDate("2024-01-01");

위는 Setter 방식을 사용하여 서비스 클래스에서 객체를 생성하는 코드의 예시이고, 아래는 @Builder를 사용하는 방식의 코드이다.

// @Builder 방식
GoodsDetailDto goodsDetailDto = GoodsDetailDto.builder()
        .name("스마트폰")
        .price(1000000)
        .description("최신 모델 스마트폰")
        .stockQuantity(100)
        .manufacturer("스마트폰 제조사")
        .color("블랙")
        .weight(200)
        .operatingSystem("안드로이드")
        .screenSize(6.5)
        .batteryCapacity(4500)
        .cameraResolution("108MP")
        .networkType("5G")
        .releaseDate("2024-01-01")
        .build();

두 코드 블록은 같은 기능을 수행하는 코드인데, Setter 방식과 같은 경우에는 매개 변수가 적을 때에는 해당 이 것이 크게 체감되지 않았는데, 매개 변수가 많아지자, 가독성이 너무 떨어진다고 판단하여 탈락시키게 되었다.


// 정적 팩토리 메서드 방식
Member member = Member.createMember("유동재", "ydjLog@naver.com");

정적 팩토리 메서드 방식과 같은 경우는 가독성 면에서는 매우 뛰어나다.
그러나 만약 첫 번째 매개변수의 타입도 문자열이고, 두 번째 매개변수의 타입도 문자열이라면,

// 정적 팩토리 메서드 방식 (이메일과 이름의 순서가 바뀌었다.)
Member member = Member.createMember("ydjLog@naver.com", "유동재");

순서를 잘못되게 작성하여도 오류가 발생하지 않아, 이 것에 의하여 문제 상황이 발생하게 되더라도 문제 상황을 해결하기가 굉장히 힘들 것 같다는 생각이 들어, 애초에 순서에서 자유로운 @Builder 에게 밀리게 되었다. 그러나 정적 팩토리 메서드 방식 역시 코드를 간결하게 만들어주는 우수한 방식이라고 생각한다.

profile
풀 스택이 되기 위해 노력하는 개발자입니다!

0개의 댓글

관련 채용 정보