Q1.
(08-08 10/22 수업을 듣고나서)
MVC 패턴에서, Mapper는 서비스 레이어에 속하는 내용이야?
A1.
MVC 패턴에서 Mapper는 일반적으로 서비스 레이어에 속합니다. Mapper는 데이터 전송 객체(DTO)와 엔티티 간의 변환을 담당하며, 이는 비즈니스 로직을 처리하는 서비스 레이어의 일부로 간주됩니다. 서비스 레이어는 비즈니스 로직을 캡슐화하고, 데이터 접근 레이어와 프레젠테이션 레이어 간의 중재 역할을 합니다.
Mapper를 서비스 레이어에 포함시키는 이유는 다음과 같습니다:
비즈니스 로직의 캡슐화: 데이터 변환 로직을 서비스 레이어에 포함시켜 비즈니스 로직을 한 곳에 모아둡니다.
유지보수성: 데이터 변환 로직을 서비스 레이어에 두어 코드의 유지보수성을 높입니다.
재사용성: 여러 서비스에서 동일한 Mapper를 재사용할 수 있습니다.
예를 들어, 아래와 같은 구조를 가질 수 있습니다:
// DTO 클래스
public class DepartmentDTO {
private Long id;
private String name;
// getters and setters
}
// 엔티티 클래스
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
// Mapper 클래스
public class DepartmentMapper {
public static DepartmentDTO toDTO(Department department) {
DepartmentDTO dto = new DepartmentDTO();
dto.setId(department.getId());
dto.setName(department.getName());
return dto;
}
public static Department toEntity(DepartmentDTO dto) {
Department department = new Department();
department.setId(dto.getId());
department.setName(dto.getName());
return department;
}
}
// 서비스 클래스
@Service
public class DepartmentService {
@Autowired
private DepartmentRepository departmentRepository;
public DepartmentDTO createDepartment(DepartmentDTO dto) {
Department department = DepartmentMapper.toEntity(dto);
department = departmentRepository.save(department);
return DepartmentMapper.toDTO(department);
}
}
이 예제에서 DepartmentMapper는 DTO와 엔티티 간의 변환을 담당하며, DepartmentService는 비즈니스 로직을 처리합니다. Mapper는 서비스 레이어의 일부로 간주됩니다.
Q2.
엔티티가 뭐야?
A2.
엔티티(Entity)는 데이터베이스 테이블과 매핑되는 객체를 의미합니다. 엔티티는 데이터베이스의 레코드를 자바 객체로 표현한 것으로, 주로 ORM(Object-Relational Mapping) 프레임워크를 사용하여 데이터베이스와 상호작용합니다. 엔티티 클래스는 데이터베이스 테이블의 구조를 반영하며, 각 필드는 테이블의 컬럼에 매핑됩니다.
예를 들어, JPA(Java Persistence API)를 사용한 엔티티 클래스는 다음과 같이 정의할 수 있습니다:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
이 예제에서 Department 클래스는 @Entity 어노테이션을 사용하여 엔티티로 정의되었습니다. @Id 어노테이션은 기본 키를 나타내며, @GeneratedValue 어노테이션은 기본 키의 생성 전략을 지정합니다. 이 클래스는 데이터베이스의 Department 테이블과 매핑되며, 각 인스턴스는 테이블의 한 레코드를 나타냅니다.
엔티티 클래스는 다음과 같은 특징을 가집니다:
1. 데이터베이스 매핑: 엔티티 클래스는 데이터베이스 테이블과 매핑됩니다.
2. 식별자: 엔티티는 고유 식별자(Primary Key)를 가집니다.
3. 상태: 엔티티는 데이터베이스의 레코드 상태를 반영합니다.
4. 영속성: 엔티티는 영속성 컨텍스트에 의해 관리됩니다.
Q3.
지금 이 프로젝트에 있는 Model 패키지 안에 있는 클래스들이 엔티티와 다른거야?
A3.
프로젝트의 Model 패키지 안에 있는 클래스들이 엔티티인지 여부는 클래스 정의와 사용된 어노테이션을 통해 확인할 수 있습니다. 엔티티 클래스는 일반적으로 @Entity 어노테이션을 사용하여 데이터베이스 테이블과 매핑됩니다.
예를 들어, Model 패키지에 있는 클래스가 다음과 같이 정의되어 있다면, 이는 엔티티 클래스입니다:
package com.example.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
위의 예제에서 @Entity 어노테이션이 사용된 Department 클래스는 엔티티입니다. 이 클래스는 데이터베이스의 Department 테이블과 매핑됩니다.
반면, Model 패키지에 있는 클래스가 엔티티가 아닌 경우, 일반적으로 @Entity 어노테이션이 없으며, 데이터베이스와 직접적인 매핑이 없습니다. 예를 들어, 단순한 데이터 전송 객체(DTO)나 비즈니스 로직을 포함하는 클래스일 수 있습니다:
package com.example.model;
public class DepartmentDTO {
private Long id;
private String name;
// getters and setters
}
위의 예제에서 DepartmentDTO 클래스는 엔티티가 아니며, 데이터베이스와 매핑되지 않습니다. 이는 주로 데이터 전송을 위해 사용됩니다.
따라서, Model 패키지 안에 있는 클래스들이 엔티티인지 확인하려면, 클래스 정의를 살펴보고 @Entity 어노테이션이 있는지 확인해야 합니다. 엔티티 클래스는 데이터베이스 테이블과 매핑되며, @Entity 어노테이션을 사용합니다. 반면, 엔티티가 아닌 클래스는 이러한 어노테이션이 없고, 데이터베이스와 직접적인 매핑이 없습니다.
Q4.
Lombok으로 import lombok.Data;
/**
Department 테이블의 구조를 정의하는 클래스 */ @Data public class Department { private int deptno; // 테이블 필드이름과 다름에 주의. 신경써보라고 일부로 바꿈. private String dname; private String loc;
}
이렇게 해둔건 무슨 의미지?
A4.
Lombok의 @Data 어노테이션을 사용한 것은 코드의 간결성과 유지보수성을 높이기 위한 것입니다. @Data 어노테이션은 여러 Lombok 어노테이션을 한 번에 적용하여, 클래스에 대해 다음과 같은 기능을 자동으로 생성해줍니다:
1. Getter 메서드: 모든 필드에 대한 getter 메서드를 생성합니다.
2. Setter 메서드: 모든 비-final 필드에 대한 setter 메서드를 생성합니다.
3. toString 메서드: 모든 필드를 포함하는 toString 메서드를 생성합니다.
4. equals 및 hashCode 메서드: 모든 필드를 기준으로 equals 및 hashCode 메서드를 생성합니다.
5. 기본 생성자: 모든 필드를 초기화하는 기본 생성자를 생성합니다.
이로 인해, 개발자는 반복적인 코드 작성을 피할 수 있으며, 코드가 더 깔끔하고 읽기 쉬워집니다.
예를 들어, 아래와 같은 코드가 자동으로 생성됩니다:
public class Department {
private int deptno;
private String dname;
private String loc;
// 자동 생성된 getter 메서드
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
// 자동 생성된 toString 메서드
@Override
public String toString() {
return "Department{" +
"deptno=" + deptno +
", dname='" + dname + '\'' +
", loc='" + loc + '\'' +
'}';
}
// 자동 생성된 equals 메서드
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Department that = (Department) o;
return deptno == that.deptno &&
Objects.equals(dname, that.dname) &&
Objects.equals(loc, that.loc);
}
// 자동 생성된 hashCode 메서드
@Override
public int hashCode() {
return Objects.hash(deptno, dname, loc);
}
}
따라서, Lombok의 @Data 어노테이션을 사용하면, 위와 같은 반복적인 코드를 직접 작성할 필요가 없어집니다. 이는 코드의 가독성을 높이고, 유지보수를 용이하게 합니다.
Q5.
지금 Models 패키지 안의 클래스들은, db에 연동할 정보를 주고 받을 때 쓸 틀로써 만들어 뒀다고 생각하면 될까?
A5.
네, 맞습니다. Models 패키지 안의 클래스들은 데이터베이스와 연동할 정보를 주고받기 위한 틀로 만들어졌다고 생각할 수 있습니다. 이러한 클래스들은 주로 데이터 전송 객체(DTO)나 엔티티로 사용됩니다.
현재 선택된 Department 클래스는 Lombok의 @Data 어노테이션을 사용하여, 데이터베이스 테이블의 구조를 정의하고, 해당 데이터를 주고받기 위한 객체로 사용됩니다. 이 클래스는 데이터베이스와의 상호작용에서 필요한 데이터를 캡슐화하고, 이를 통해 데이터베이스 레코드와 자바 객체 간의 매핑을 쉽게 할 수 있습니다.
예를 들어, Department 클래스는 다음과 같은 상황에서 사용될 수 있습니다:
1. 데이터 전송 객체(DTO): 서비스 레이어와 컨트롤러 간의 데이터 전송을 위해 사용됩니다.
2. 엔티티: ORM 프레임워크(JPA 등)를 사용하여 데이터베이스 테이블과 매핑되는 객체로 사용됩니다.
3. 폼 객체: 사용자 입력을 받아서 처리하기 위한 객체로 사용됩니다.
따라서, Models 패키지 안의 클래스들은 데이터베이스와의 연동을 위해 필요한 데이터를 주고받기 위한 틀로써 만들어졌다고 볼 수 있습니다.
'언어 및 도구들 공부 > Spring' 카테고리의 다른 글
| @ResponseBody + void 메소드? (0) | 2024.10.24 |
|---|---|
| DAO 패턴과 MyBatis (0) | 2024.10.22 |
| throw e? (0) | 2024.10.22 |
| 테이블 이름은 단수? 복수? (0) | 2024.10.22 |
| 인터페이스의 구현체를 자동으로 주입 (0) | 2024.10.22 |