-
[스프링부트/웹 애플리케이션 개발]홈 화면과 레이아웃, 부트스트랩 적용, 회원등록스프링&스프링부트 2023. 1. 5. 15:26
controller
package jpabook.jpashop; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class JpashopApplication { public static void main(String[] args) { Hello hello = new Hello(); hello.setData("hello"); String data = hello.getData(); //System.out.println("data = " + data); SpringApplication.run(JpashopApplication.class, args); } }
home.html
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head th:replace="fragments/header :: header"> <title>Hello</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>
- include-style layouts 스타일 > 실무에서 잘 사용하지 않음
- hieralchical-style layouts 스타일을 사용함 > 다음 프로젝트 할 때 사용해 보기
( Thymeleaf Page Layouts - Thymeleaf )
Bootstrap
View 리소스 > Bootstrap( https://getbootstrap.com/docs/5.3/getting-started/download/ ) 사용
1) CSS and JS 파일 다운로드
2) static 파일에 복사 붙여 넣기
3) css 폴더에 jumbotron-narrow.css 파일 추가
MemberController
package jpabook.jpashop.controller; import jpabook.jpashop.service.MemberService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller @RequiredArgsConstructor public class MemberController { private final MemberService memberService; @GetMapping("/members/new") public String createForm(Model model) { model.addAttribute("memberForm", new MemberForm()); return "members/createMemberForm"; } @PostMapping("/members/new") public String create(@Valid MemberForm form, BindingResult result) { //@Valid MemberForm memberForm //form에 있는 notEmptry와 같은 어노테이션 사용 가능 //@Valid + BindingResult result > 오류가 담기고 밑에 코드 실행 if (result.hasErrors()) { return "members/createMemberForm"; } Address address = new Address(form.getCity(), form.getStreet(), form.getZipcode()); Member member = new Member(); member.setName(form.getName()); member.setAddress(address); memberService.join(member); return "redirect:/"; } }
MemberForm
package jpabook.jpashop.controller; import lombok.Getter; import lombok.Setter; import javax.validation.constraints.NotEmpty; @Getter @Setter public class MemberForm { @NotEmpty(message = "회원 이름은 필수 입니다.") private String name; private String city; private String street; private String zipcode; }
참고: 폼 객체 vs 엔티티 직접 사용?
> 화면 요구사항이 복잡해지기 시작하면, 엔티티에 화면을 처리하기 위한 기능이 점점 증가한다.
결과적으로 엔티티는 점점 화면에 종속적으로 변하고, 이렇게 화면 기능 때문에 지저분해진 엔티티는 결국 유지보수하기 어려워진다.
> 실무에서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 한다.
> 화면이나 API에 맞는 폼 객체나 DTO를 사용해서 화면이나 API 요구사항을 이것들로 처리하고, 엔티티는 최대한 순수하게 유지하자.
728x90'스프링&스프링부트' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]변경 감지와 병합(merge) (0) 2023.01.05 [스프링부트/웹 애플리케이션 개발]회원 목록 조회, 상품 등록, 상품 목록, 상품 수정 (0) 2023.01.05 [스프링부트/웹 애플리케이션 개발]주문 도메인 개발-2 (0) 2023.01.05 [스프링부트/웹 애플리케이션 개발]주문 도메인 개발-1 (0) 2023.01.05 [스프링부트/웹 애플리케이션 개발]상품 엔티티 개발 (0) 2023.01.04