[Spring Boot] MVC 패턴 작성법과 예시(JPA)

hameee·2024년 1월 8일
0

Spring Boot

목록 보기
17/20

📍 전체 흐름

🚩 JPA 주의할 점

  • 실행 시 Bean 중복 오류가 날 수 있다. 해당 포스팅의 3번을 참고한다.

📍 파일 구조

src
└── main
    ├── java
    │   └── 베이스 패키지
    │       └── ...
    │           ├── bo
    │           │   └── 테이블명BO.java
    │           ├── entity
    │           │   └── 테이블명Entity.java
    │           ├── repository
    │           │   └── 테이블명Repository.java
    │           └── Controller.java
    └── webapp
        └── WEB-INF
            └── jsp
                └── ...
                    ├── 페이지명1.jsp
                    ├── 페이지명2.jsp
                    └── ...

📍 Controller

1) 주요 어노테이션

  • 클래스
    • @Controller(JSP 경로 리턴->HTML)/@RestController(객체 리턴->JSON, String 리턴->HTML)
    • 메소드의 공통 요청 URL이 존재하는 경우: @RequestMapping("공통 요청 URL")
  • 필드
    • BO 클래스를 받는 필드: @Autowired
  • 메소드
    • GET 요청만 받는 메소드: @RequestMapping(path = "요청 URL", method = RequestMethod.GET)/@GetMapping("요청 URL")
    • POST 요청만 받는 메소드: @RequestMapping(path = "요청 URL", method = RequestMethod.POST)/@PostMapping
    • 모든 요청(GET/POST/UPDATE/DELETE)을 받는 메소드: @RequestMapping("요청 URL"):
  • 파라미터
    • 단일 파라미터를 바인딩하는 경우
      • 필수 파라미터: @RequestParam("요청 파라미터명")
      • 선택 파라미터: @RequestParam(value = "요청 파라미터명", required = false, defaultValue = "기본값")
    • 여러 파라미터를 하나의 객체로 바인딩하는 경우
      • @ModelAttribute

2) 주의 사항

  • insert 시, auto_increase 속성을 가진 필드는 자동 생성되므로 삽입하지 않는다.
  • 매칭 관계: (요청 URL) ?⭐️key⭐️=1 <-> (Controller 내부 메소드의 파라미터) @RequestParam("⭐️key⭐️") int id123
  • Model은 org.springframework.ui.Model에서 import 한다.
  • Model의 값을 JSP에서 사용 시, ${obj.key} 혹은 ${key}로 가져온다.
  • redirect 시, return "redirect:재요청 보낼 주소"로 작성한다.
  • AJAX로 요청받는 메서드일 경우, 응답으로 View 경로가 아닌 성공 시 반환할 데이터를 AJAX로 다시 보내야 하므로 해당 메서드에 @ResponseBody 작성 후 String을 반환한다. (해당 포스팅 참고)

3) 권장 사항

📍 Service(= BO)

1) 주요 어노테이션

  • 인터페이스
    • @Service
  • 필드
    • Repository 인터페이스를 받는 필드: @Autowired

2) 주의 사항

3) 권장 사항

  • 메소드명: get/add/update/delete + 도매인명/도매인명List + By필드명(조건)
  • 빌더 패턴으로 엔티티를 생성한다.

📍 Repository(= DAO, Mapper)

1) 주요 어노테이션

2) 주의 사항

  • interface로 생성한다.
  • JpaRepository<엔티티, pk 자료형>을 상속받는다.
  • JpaRepository에서는 기본 메서드를 제공한다.
  • JpaRepository에서 제공하는 기본 메서드 외의 메서드는 직접 작성해야 한다.(JPQL)

3) 권장 사항

📍 Entity(= Domain, Model)

1) 주요 어노테이션

  • 클래스
    • Lombok 어노테이션
      • @ToString: 클래스에 대한 toString() 메서드를 생성
      • @AllArgsConstructor: 모든 필드에 대한 매개변수가 있는 생성자 생성
      • @NoArgsConstructor: 매개변수가 없는 생성자 생성
      • @Builder(toBuilder = true): Builer는 클래스에 대한 빌더 패턴 제공. toBuilder는 빌더를 복제할 수 있는 메소드를 생성하도록 하는 옵션(update 시 사용)
      • @Getter: 모든 필드에 대한 getter 메서드 생성
    • JPA 어노테이션
      • @Entity: 클래스가 JPA 엔터티임을 표시
      • @Table(name = "테이블명"): 엔터티의 데이터베이스 테이블에 대한 이름을 지정
  • 필드
    • JPA 어노테이션
      • @Id: 엔터티의 기본 키
      • @GeneratedValue(strategy = GenerationType.IDENTITY): 기본 키를 자동으로 생성하도록 지정
      • @Column(name="컬럼명", updatable=true): 카멜케이스로 작성된 필드에 작성. 엔터티 필드를 데이터베이스 테이블의 컬럼에 매핑. updatable=true는 생략 가능.
    • Hibernate 어노테이션
      • @UpdateTimestamp: 엔터티가 업데이트될 때마다 현재 타임스탬프로 필드를 채우도록 표시

2) 주의 사항

  • createdAt의 경우 새로운 레코드가 삽입될 때만 값이 설정되어야 하므로 @Column(name="컬럼명" updatable=false)로 작성한다.

3) 권장 사항

📍 예시

1. 파일 구조 & 흐름

2. 코드

🚩 가독성을 위해 import 문은 제외했습니다.

1) Controller

2) Service(= BO)

3) Repository(= DAO, Mapper)

4) Entity(= Domain, Model)

5) JSP

0개의 댓글