

package com.example.hr1.domain.main.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class EmpController {
@GetMapping("/emp")
// Mapping을 기반으로 함수를 실행 시키기 때문에
// controller의 함수 이름은 중요하지 않다
public ModelAndView getEmpTablePage(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("emp/emp-list");
return modelAndView;
}
@GetMapping("/emp/1")
public ModelAndView getEmpDetailPage(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("emp/emp-detail");
return modelAndView;
}
}
엔티티는 데이터베이스를 담는 컵과 비슷하다.
근데 엔티티는 컨트롤러로 못간다. DTO라는 중간책을 이용해 넘아가야한다!
엔티티는 육고기다, 가공이 안되었다.
dto는 돈까스등의 가공 가정이다.
컨트롤러는 서비스하고만 이야기한다.
서비스는 라피지토리하고만 이야기한다
DTO는 그 두개를 오가는 중개상 비스무리하다.

package com.example.hr1.model.emp.entity;
import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name= "employees")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class EmployeesEntity {
@Id
@Column(name = "employee_id", nullable = false, unique = true)
private Integer employeeId;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(name = "email", nullable = false)
private String email;
@Column(name = "phone_number")
private String phoneNumber;
@Column(name = "hire_date",nullable = false)
private LocalDateTime hireDate;
@Column(name = "job_id",nullable = false)
private String jobId;
@Column(name = "salary", nullable = false)
private Double salary;
@Column(name = "commission_pct")
private Double commissionPct;
@Column(name = "manager_id")
private Integer managerId;
@Column(name = "department_id")
private Integer departmentId;
}

코드는 간단하지만 jpa라는 외부함수가 db연결등의 거의 모든 역할을 담당해준다.
package com.example.hr1.model.emp.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.hr1.model.emp.entity.EmployeesEntity;
@Repository
public interface EmployeesRepository extends JpaRepository<EmployeesEntity, Integer>{
}
적용하고자 할 페이지가 두개니 두개다.

package com.example.hr1.domain.main.dto;
import com.example.hr1.model.emp.entity.EmployeesEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public class EmpDetailDTO {
private Integer employeeId;
private String firstName;
private String lastName;
private Double salary;
public static EmpDetailDTO fromEntity(EmployeesEntity employeesEntity) {
return EmpDetailDTO.builder()
.employeeId(employeesEntity.getEmployeeId())
.firstName(employeesEntity.getFirstName())
.lastName(employeesEntity.getLastName())
.salary(employeesEntity.getSalary())
.build();
}
}
package com.example.hr1.domain.main.dto;
import java.util.List;
import com.example.hr1.model.emp.entity.EmployeesEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class EmpTableDTO {
private Integer employeeId;
private String firstName;
public static EmpTableDTO fromEntity(EmployeesEntity employeesEntity) {
return EmpTableDTO.builder()
.employeeId(employeesEntity.getEmployeeId())
.firstName(employeesEntity.getFirstName())
.build();
}
public static List<EmpTableDTO> fromEntityList(List<EmployeesEntity> employeesEntityList) {
return employeesEntityList
.stream()
.map((employeesEntity) -> fromEntity(employeesEntity))
.toList();
}
}
package com.example.hr1.domain.main.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import com.example.hr1.domain.main.dto.EmpTableDTO;
import com.example.hr1.domain.main.service.EmpService;
@Controller
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping("/emp")
// Mapping을 기반으로 함수를 실행 시키기 때문에
// controller의 함수 이름은 중요하지 않다
public ModelAndView getEmpTablePage(){
ModelAndView modelAndView = new ModelAndView();
List<EmpTableDTO> empTableDTOList = empService.getEmpTableData();
modelAndView.addObject("empTableDTOList", empTableDTOList);
modelAndView.setViewName("emp/emp-list");
return modelAndView;
}
@GetMapping("/emp/1")
public ModelAndView getEmpDetailPage(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("emp/emp-detail");
return modelAndView;
}
}
@GetMapping("/emp/{employeeId}")
public ModelAndView getEmpDetailPage(Integer employeeId){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("emp/emp-detail");
return modelAndView;
}
@GetMapping("/emp/{employeeId}")
public ModelAndView getEmpDetailPage(@PathVariable Integer employeeId){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("emp/emp-detail");
System.out.println(employeeId);
return modelAndView;
}

@Service
public class EmpService {
@Autowired
private EmployeesRepository employeesRepository;
public List<EmpTableDTO> getEmpTableData() {
List<EmployeesEntity> employeesEntityList = employeesRepository.findAll();
List<EmpTableDTO> empTableDTOList = new ArrayList<>();
for (int i = 0; i < employeesEntityList.size(); i++) {
EmployeesEntity employeesEntity = employeesEntityList.get(i);
EmpTableDTO empTableDTO = EmpTableDTO.builder()
.employeeId(employeesEntity.getEmployeeId())
.firstName(employeesEntity.getFirstName())
.build();
empTableDTOList.add(empTableDTO);
}
return empTableDTOList;
// return EmpTableDTO.fromEntityList(employeesRepository.findAll());
}

properties:
hibernate:
format_sql: true
해당 코드를 끼워넣으면 터미널 메세지가 보기쉽게 정렬된다

아주 유익한 내용이네요!