[Spring] 게시판 등록 폼 기본 순서 정리(Feat. Builder 메소드 체이닝)

류넹·2024년 3월 4일
1

Spring

목록 보기
20/50

1. list.jsp

  • /WEB-INF/views/dept/list.jsp에 신규 부서 등록폼 페이지를 요청하는 <a> 링크 추가
	<div class="row mb-3">
		<div class="col-12">
			<div class="text-end">
				<a href="create" class="btn btn-primary">신규 부서</a>
			</div>
		</div>
	</div>



2. Controller.java

  • GET 방식http://localhost/dept/create 요청에 매핑되는 요청핸들러 메서드 정의하기
  • 요청핸들러 메서드에서는 /WEB-INF/views/dept/form.jsp로 내부이동시키는 문자열 반환
	@GetMapping("/create")
	public String form(Model model) {
		return "dept/form";
	}



3. form.jsp

  • 신규 부서 입력 폼 작성
    (부서명, 부서연락처, 팩스번호를 입력하는 입력필드 추가)
			<form class="border bg-light p-3" method="post" action="create">
				<div class="form-group mb-3">
					<label class="form-label">부서명</label>
					<input type="text" class="form-control" name="name" />
				</div>
				<div class="form-group mb-3">
					<label class="form-label">부서연락처</label>
					<input type="text" class="form-control" name="tel" />
				</div>
				<div class="form-group mb-3">
					<label class="form-label">팩스번호</label>
					<input type="text" class="form-control" name="fax" />
				</div>
				<div class="text-end">
					<button type="submit" class="btn btn-primary">등록</button>
				</div>
			</form>



4. Form 클래스 작성

  • com.sample.web.form 패키지에서 신규부서 등록폼에서 입력한 정보를 전달받는 DeptCreateForm .java 클래스 정의
@Getter
@Setter
@ToString
public class DeptCreateForm {
	// form클래스에는 입력화면에 있는 변수만 있어야 함. -> no는 없어야 함
	private String name;
	private String tel;
	private String fax;
}

/* 날짜 형식은 아래처럼 정의
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date hireDate;
*/



5. Controller

  • POST 방식http://localhost/deptd/add 요청에 매핑되는 요청핸들러 메서드를 정의
  • 신규부서 등록화면에서 입력한 모든 입력값을 DeptCreateForm객체로 전달받기
	@PostMapping("/create")
	public String create(DeptCreateForm deptCreateForm) {
		hrService.createDept(deptCreateForm);
		
		return "redirect:list";
	}



6. Service

  • HrService에 DeptCreateForm 객체를 전달받아서 신규부서로 등록하기
	public void createDept(DeptCreateForm form) {
		Dept dept = Dept.builder()
				.name(form.getName())
				.tel(form.getTel())
				.fax(form.getFax())
				.build();
		
		deptMapper.insertDept(dept);
	}



7. Mapper interface

  • DeptMapper에 신규부서정보를 전달받아서 저장시키는 추상메서드 작성
	void insertDept(Dept dept);



8. XML

  • Depts.xml에 신규부서정보를 전달받아서 저장시키는 SQL 작성
	<insert id="insertDept" parameterType="com.sample.vo.Dept">
		insert into shop_depts
		values
		(depts_seq.nextval, #{name}, #{tel}, #{fax})
	</insert>




🚩 Tip.

  • Service에서 메서드 정의 시, Form클래스에 객체를 set해주는 메서드를 만들어두면
    Builder의 메서드 체이닝으로 길게 작성하지 않고 해당 메서드만 호출하면 간단하게 작성 가능
  1. Builder의 메서드 체이닝 방법 (Service의 코드가 길어짐)
  • Form 클래스
@Getter
@Setter
@ToString
public class EmpCreateForm {
	private String name;
	private String tel;
	private String email;
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date hireDate;
	private int salary;
	private int deptNo;
}
  • Service
	public void createEmp(EmpCreateForm form) {
		// 등록 폼에서 부서번호 조회하기 위해 필요
		Dept dept = Dept.builder()
				.no(form.getDeptNo())
				.build();
		
		// 빌더가 모든 생성자를 알아서 만들어줌
		Employee emp = Employee.builder()
				.name(form.getName())
				.tel(form.getTel())
				.email(form.getEmail())
				.salary(form.getSalary())
				.hireDate(form.getHireDate())
				.dept(dept)
				.build();
		
		empMapper.insertEmp(emp);
	}



2. Form클래스에 정의한 메서드 호출 방법 (Service 코드 단 한 줄)

  • Form 클래스
@Getter
@Setter
@ToString
public class EmpCreateForm {
	private String name;
	private String tel;
	private String email;
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date hireDate;
	private int salary;
	private int deptNo;
	
	// 객체를 set해주는 메서드 정의
	public Employee toEmp() {
		Employee emp = new Employee();
		emp.setName(name);
		emp.setTel(tel);
		emp.setEmail(email);
		emp.setSalary(salary);
		emp.setHireDate(hireDate);
		Dept dept = new Dept();
		dept.setNo(deptNo);
		emp.setDept(dept);
		
		return emp;
	}
}
  • Service
	public void createEmp(EmpCreateForm form) {
    	// Form클래스 메서드 호출
		Employee emp = form.toEmp();
		
		empMapper.insertEmp(emp);
	}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글