DTO (Data Transfer Object)
DTO (Data Transfer Object)
✴DTO(Data Transfer Object)란 데이터를 전송하기 위한 객체 입니다. 계층 간(클라이언트 -> 서버, 서비스 <-> 데이터베이스) 간 데이터를 주고 받기 위해 사용되는 객체 입니다.
### 1. DTO 사용 이유
자바에서 데이터를 전달 하는 방법은 여러가지가 있지만, DTO를 사용하는 이유는 다음과 같습니다.
✅ 1) 데이터 캡슐화 및 보호
DTO는 필요한 데이터만 전달하므로 불필요한 노출을 막을 수 있습니다.
예를 들어, 데이터 베이스에서 가져온 User 객체에는 비밀번호와 같은 민감한 정보가 포함될 수 있지만, DTO를 사용하면 필요한 필드만 전달할 수 있습니다.
✅ 2) 계층 간 데이터 전달 용이
DTO는 컨트롤러, 서비스, 리포지토리 간 데이터를 전달하는 역할을 합니다.
- Entity 객체를 직접 사용하면 데이터베이스 구조와 서비스 로직이 결합될 수 있습니다.
- DTO를 사용하면 데이터 형식이 고정되지 않고 유연하게 변경할 수 있습니다.
✅ 3) 데이터 가공 및 변환 용이
DTO 를 사용하면 데이터를 가공하거나 포맷을 변경하기 쉽습니다.
예를 들어, 날짜 형식 변환, 필드 이름 변경, 추가적인 가공 작업을 DTO에서 처리할 수 있습니다.
### 2. DTO 사용 예제
☑ 1) DTO 없이 Entity 그대로 사용
@Entity // 이 클래스가 데이터 베이스 테이블에 해당하는 엔터티임을 나타냄 // entity : 독립체
public class User {
@Id // 이 속성이 엔터티의 기본 키 임을 나타냄
@GenerateValue(strategy = GenerationType.IDENTITY) // 기본 키가 자동으로 생성되도록 생성 // generate : 일으키다, 초래하다 value : 가치 strategy : 전략 GenerationType : 세대 유형 Identity : 신원
private Long id;
private String username;
private String password; // 보안 문제 발생 가능
}
❗문제점:
- password 필드를 그대로 반환 하면 보안 이슈 발생 !
- User 엔티티의 변경이 클라이언트에 집접 영향을 줌
❗엔터티 정의 했다 라는 말은 데이터베이스의 User 테이블과 연결되는 클래스를 만들었다는 의미
- 즉, 이 User 클래스를 통해 데이터를 데이터베이스에서 가져오거나 저장할 수 있게 됨.
☑ 2)DTO 를 활용하여 데이터 보호 및 가공
// DTO 정의
public class UserDTO{
private Long id;
private String username;
// 생성자
public UserDTO(Long id, String username){
this.id = id;
this.username = username;
}
// Getter & Setter
public Long GetId() { return id;}
public void setId(Long id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
}
✅장점
- password 필드가 노출되지 않음!
- 엔티티 API 응답을 분리하여 유지보수 용이 !
#### 3. public 접근 제어자(Access Modifier)중 하나로 클래스. 메서드, 변수 등이 어디에서 접근할 수 있는지 결정하는 역할을 합니다.
- 어디서든 접근 가능 (다른 패키지, 다른 클래스에서도 접근 가능)
- 제한이 없으며 public class UserDTO {} 라고 선선시, 모든 클래스에서 UserDTO 를 사용 가능
✴class UserDTO 의 의미
- 클래스를 정의 하는 키워드, UserDTO는 클래스 이름 (사용자가 정의한 데이터 구조)
- {} 내부에 클래스의 속성(변수)과 동작(메서드) 이 들어감
✴전체 의미 (public class UserDTO {})
- 어디서든 접근 가능한 UserDTO 라는 클래스를 정의
- 예를 들어, UserService 나 UserController 에서도 UserDTO 객체를 만들고 사용 가능
- public 이 없다면 동일한 패키지 내에서만 사용 가능하고 다른 패키지에서 UserDTO를 사용하려 하면 접근 할 수 없음 (컴파일 오류 발생)
➡정리
- public : 어디서든 접근 가능 ( 모든 패키지, 모든 클래스)
- (없음, default) : 같은 패키지 내에서만 접근 가능, 동일한 패키지 내에서만 사용가능
- private 같은 클래스 내에서만 접근 가능, 외부에선 접근 불가
- protected 같은 패키지 + 자식 클래스에서 접근 가능, 상속 관계에서 사용 가능
#### 4. Getter & Setter의 개념과 역할
클래스의 필드(멤버 변수)는 보통 private 접근 제어자를 사용하여 외부에서 직접 접근하지 못하도록 보호 합니다.
이렇게 하면 데이터를 안전하게 관리할 수 있찌만, 필드 값을 가져오거나 변경하려면 방법이 필요 합니다.
이를 위해 Getter와 Setter 메서드를 사용 합니다.
###### 1. Getter 란? (get + 변수명)
- 객체의 필드 값을 읽어오는 메서드 입니다.
- 메서드 이름은 보통 get + 변수명 (첫 글자는 대문자로) 로 작성
-
public Long getId(){
return id;
}
public String getUsername(){
return username;
}
➡ 설명
- getId() 메서드는 id 값을 반환함
- getUsername() 메서드는 username 값을 반환함
- 즉, user.getId() 를 호출 하면 id 값을 가져 올 수 있음.
###### 2. Setter란? (set + 변수명)
- 객체의 필드 값을 변경하는 메서드
- 메서드 이름은 보통 set + 변수명(첫 글자는 대문자로) 로 작성합니다.
✅ 예제: setId() 와 setUsername()
public void setId(Long id){
this.id = id;
}
public void setUsername(String username){
this.username = username;
}
🔷 설명
- setId(Long id) -> 매개 변수로 받은 id 값을 현재 객체의 id 필드에 저장함.
- setUsername(String username) -> 매개변수로 받은 username 값을 현재 객체의 username 필드에 저장함
###### 3. Getter & Setter 사용 예제
public class Main {
public static void mian(String[] args){
UserDTO user = new UserDTO(1L, "Alice"); //객체 생성
// Getter로 값 가져오기
System.out.println("ID: " + user.getID()); // 출력: ID : 1
System.out.println("Username: " + user.getUsername()); // 출력 : Username: Alice
// Setter로 값 변경
user.setId(2L);
user.setUsername("Bob");
// 변경된 값 출력
System.out.println("Updated ID: " + user.getID()); //출력: Updated ID: 2
System.out.println("Updated Username:" + user.getUsername()); // 출력: Updated Username: Bod
}
}
'IT 개발' 카테고리의 다른 글
react setStatus 와 괄호의 역할, 점연사자 화살표 함수 에 관하여 (0) | 2025.03.18 |
---|---|
react jsx 에서 쿠키란 또는 쿠키 설정에 관하여 (0) | 2025.03.17 |
자바에서 DTO 란 무엇 일까. (0) | 2025.02.21 |
자바 spring 패키지 및 객체 에 대한 설명 (2) | 2025.02.19 |
카카오톡 광고 차단 방법 공유 드립니다. (0) | 2025.02.19 |