웹(Web)/백엔드(Backend)

[SpringBoot] java record와 DTO에 관하여...

SK_MOUSE 2023. 5. 12. 17:59
반응형

SpringBoot에서 Input, Output처리에 대해 정의하는 글이다.

 

VO(Value Object) : 불변값 -> 따라서 return값으로 사용(수정X)

DTO(Data Transfer Object): Getter/Setter 자유롭게 사용(수정O)

(암기는 DTO가 T가 들어있으니 geTTer/seTTer 를 사용한다고 생각하면 된다.)

 

Client한테 받을때(수신정보) : BO(Business Object)

Server에서 보낼때(송신정보) : VO(Value Object)

 

흔히 위 객체를 InputVO, OutputVO로 혼동해서 쓰는데, 사실 여기서는 Ouput일때는 BO로 쓰는것이 조금 더 명확한 표현이라 할 수 있다.

 

*BO(Business Object) : 비즈니스 로직을 포함하는 객체

Client한테 받을때(수신정보) : BO(Business Object) <=  InputVO
Server에서 보낼때(송신정보) : VO(Value Object) <= OutputVO

 

아래는 VO와 BO의 활용 위치 예시이다.

public class Controller{
	@PostMapping
	public TestVO exampleRequest(TestBO testBO){
		
        ...
        
        return testVO; 
	}
}

Record

그렇다면 VO와 같이 변경이 필요없는 객체를 간략하게 표현하는 record에 대해서 알아보겠다.

반응형

<선 요약>

- Java 16이상 버전부터 사용 권장

- VO객체와 같이 생성 후 setter로 변환 필요없는 객체가 필요할때 사용.

- Entity 사용X. -> setter안되므로 JPA와 같은 DAO 목적으로도 사용X

- 데이터 가공 시 중간에 변질될 우려 없음.

public class ExampleVO{
    private String name;
    private Integer age;
    
    public ExampleVO(String name, Integer age){
    	this.name=name;
        this.age=age;
    }
}

위와 같이 한번 선언한 변수에 대해서 변경이 필요없는 VO객체에 대해 Intellij는 아래와 같이 record를 사용할 것을 제시한다.

public record ExampleVO(String name, Integer age){
}

이처럼 선언하는 record는 다음의 특성을 갖는다.

 

  1. record는 불변 객체로 abstract로 선언할 수 없으며 암시적으로 final로 선언됩니다. 한 번 값이 정해지면 setter를 통해 값을 변경할 수 없으며 상속을 할 수 없습니다.
  2. record 내 각 필드(헤더에 나열한 컴포넌트)는 private final로 정의됩니다.
  3. 다른 클래스를 상속 받을 수 없습니다만, 인터페이스로는 구현이 가능합니다. (extends : X, implements : O)
  4. 레코드 내부에 멤버 변수(인스턴스 필드)를 선언할 수 없습니다. 그러나 static 변수는 생성이 가능합니다. 이는 헤더에서 정의한 멤버만을 record에서 관리하기 위함입니다.
  5. 위의 4가지 주요 특징을 제외하고는 자바의 클래스 개발과 동일하게 사용할 수 있습니다.
    new 키워드를 통해 객체화 가능
    static 메소드, static 필드 선언 가능
    중첩 클래스 사용 가능 및 제너릭 타입으로 지정 가능

 

그 외 아래와 같이 커스텀할 수 있다.

public record ExampleVO(String name, Integer age) {

    @Override
    public String toString() {
        return "ExampleVO " +
                "커스텀 toString()입니다";
    }

    public boolean isCute() {
        return this.name.contains("cute");
    }
}

* record는 Java 14버전부터 지원이 되지만, 16버전부터 다양한 기능을 모두 사용가능하다.

JAVA버전 고려한 사용권장.

 


추가내용

DAO(Data Access Object) : DB연결 및 데이터 처리하는 객체

ex) CustomerAAA.java -> Mapper/JpaRepository와 주고 받는 데이터

 

반응형