스프링부트 - 페이지 작성 2

Wald Eisen·2023년 7월 18일

study

목록 보기
16/26

일단 html을 두개 만들자.


그 다음은 컨트롤러를 만든다.

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;
    }
}

만들었다면 이제는 model의 entity를 만든다.

엔티티는 데이터베이스를 담는 컵과 비슷하다.
근데 엔티티는 컨트롤러로 못간다. 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;
}

model의 리포지토리도 만들자.

코드는 간단하지만 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>{

}

dto를 만든다.

적용하고자 할 페이지가 두개니 두개다.

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();
    }

}

이제 "다시" 컨트롤러에 dto에 설정했던 걸 다시 끼워넣자.

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;
    }

integer로 자동 변환

    @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다, db의 내용을 html에 띄우도록 코드를 짜보자.

@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

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

4개의 댓글

comment-user-thumbnail
2023년 7월 18일

아주 유익한 내용이네요!

답글 달기
comment-user-thumbnail
2023년 7월 18일

뛰어난 글이네요, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

아주 유익한 내용이네요!

답글 달기
comment-user-thumbnail
2023년 7월 18일

아주 유용한 정보네요!

답글 달기