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는 다음의 특성을 갖는다.
- record는 불변 객체로 abstract로 선언할 수 없으며 암시적으로 final로 선언됩니다. 한 번 값이 정해지면 setter를 통해 값을 변경할 수 없으며 상속을 할 수 없습니다.
- record 내 각 필드(헤더에 나열한 컴포넌트)는 private final로 정의됩니다.
- 다른 클래스를 상속 받을 수 없습니다만, 인터페이스로는 구현이 가능합니다. (extends : X, implements : O)
- 레코드 내부에 멤버 변수(인스턴스 필드)를 선언할 수 없습니다. 그러나 static 변수는 생성이 가능합니다. 이는 헤더에서 정의한 멤버만을 record에서 관리하기 위함입니다.
- 위의 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버전부터 다양한 기능을 모두 사용가능하다.
추가내용
DAO(Data Access Object) : DB연결 및 데이터 처리하는 객체
ex) CustomerAAA.java -> Mapper/JpaRepository와 주고 받는 데이터
'웹(Web) > 백엔드(Backend)' 카테고리의 다른 글
"JAVA" 백엔드 개발자 로드맵 (1) | 2024.02.26 |
---|---|
Nexus 3.xx 설치/실행 오류 해결(Windows 환경) (0) | 2023.11.18 |
Spring Data JPA 페이징 (0) | 2022.09.01 |
Intellij 한번에 변수 이름 바꾸는 단축키 (0) | 2022.08.31 |
Spring Data JPA @Query 활용법(JPQL, DTO) (0) | 2022.08.31 |