Spring Boot.02_JPA-게시판

이혜민·2024년 10월 10일

SpringBoot

목록 보기
3/3

< 수업 순서 - 2024.10.07 >

⭐JPA(Java Presistence API) : ORM(Object Relational Mapping) 기능을 제공하는 표준 인터페이스

⭐ORM : 데이타베이스의 테이블과 Java 객체가 1:1로 매핑되도록 처리하는 기능 - 객체와 테이블이 자동으로 매핑되어 필요한 sql 명령이 자동으로 생성

  • but 복잡한 sql 명령을 생성하기 불편하며 테이블 결합이 많아질 경우 가독성 감소

📍게시판 생성📍

01. BoardController

  • write 요청 처리 메소드 작성 - GET, POST 매핑

02. board 폴더 생성 후 write.html 생성

03. Board DTO 테이블

04. xyz.itwill.boot.entity 패키지

05. BoardEntity : Entity 클래스

  • Entity 클래스 : 테이블을 매핑 처리하기 위한 Java 객체를 생성하기 위한 클래스 - Entity 클래스의 필드는 테이블의 컬럼과 매핑되도록 작성

  • @Entity : Java 객체를 테이블로 사용하기 위한 기능을 제공하는 어노테이션 - 테이블의 이름은 클래스 이름으로 자동 설정

  • @Table : 테이블 관련 정보를 제공하기 위한 어노테이션

    • name 속성 : 테이블의 이름을 속성값으로 설정
  • @id : 테이블의 컬럼에 Primary Key 제약조건을 부여하기 위한 어노테이션

  • @GetneratedValue : 자동 증가값을 제공받아 컬럼에 저장하기 위한 어노테이션

    • strategy 속성 : 자동 증가값을 제공하기 위한 방법을 속성값으로 설정
    • GenerationType.SEQUENCE : 테이터베이스의 시퀀스를 사용해 자동 증가값을 제공받아 저장 - Oracle에서 사용
    • generator 속성
  • @SequenceGenerator : 데이터베이스에 시퀀스를 생성하여 제공하는 어노테이션

    • @GeneratedValue 어노테이션의 strategy 속성값을 [GenerationType.SEQUENCE]로 설정한 경우 @SequenceGenerator 어노테이션을 사용해 시퀀스가 생성되도록 설정
    • name 속성 : @SequenceGenerator 어노테이션의 식별자를 속성값으로 설정
    • sequenceName 속성 : 시퀀스의 이름을 속성값으로 설정
  • @Column : 필드를 컬럼으로 변환하기 위한 어노테이션 - 컬럼 속성을 변경하지 않을 경우 생략 가능

    • length 속성 : 컬럼의 크기를 속성값으로 설정 - 기본값 [255]
    • nullable 속성 : 기본값은 true이며 false인 경우 테이블에 NOT NULL 제약조건 부여
  • @CreationTimestamp : 테이블에 행이 삽입될 때 생성된 시간을 저장하는 기능을 제공하는 어노테이션

    • name 속성 : 컬럼명을 속성값으로 설정
    • updatable 속성 : false로 설정된 경우 테이블의 행 변경시 컬럼 미사용
  • @UpdateTimestamp : 테이블의 행이 변경될 때 자동으로 생성된 시간을 변경하는 기능을 제공하는 어노테이션

  • insertable 속성 : false로 설정된 경우 테이블의 행 삽입시 컬럼 미사용

06. BaseEntity : Entity 클래스의 부모 클래스 역할

  • @MappedSuperclass : 부모 역할의 Entity 클래스로 설정하기 위한 어노테이션 - 데이터베이스의 테이블과 매핑되지 않도록 설정

  • @EntityListeners : EntityListener 클래스를 등록하기 위한 어노테이션 - AuditingEntityListener 클래스를 등록하여 생성 시간과 변경 시간을 자동으로 관리되도록 설정

07. BoardRepository 인터페이스(DAO 클래스) : JpaRepository 인터페이스 상속

  • JpaRepository 인터페이스 : CRUD 기능을 제공하는 인터페이스

    • 첫번째 제네릭에는 Entity 클래스로 작성, 두번째 제네릭에는 PK 제약조건이 설정된 필드의 자료형으로 작성해 JpaRepository 인터페이스의 메소드가 필요한 정보를 제공하여 사용되도록 설정

    • Repository 인터페이스를 작성하면 JPA 내부에서 인터페이스를 상속받은 자식클래스로 객체 생성

08. BoardService 인터페이스

09. BoardServiceImpl

  • boardRepository 필드 작성
  • JpaRepository.save(Entity entity) : 매개변수로 전달받은 Entity 객체로 테이블에 행을 삽입하여 저장하는 메소드

10. BoardDTO(수정)

  • BoardEntity 필드 생성
    • 필드에 저장된 값이 컬럼값이 됨

11. application.properties

  • #JPA
    • spring.jpa.hibernate.ddl-auto=create : 테이블이 있다면 기존 테이블을 지운 후 새롭게 생성
    • spring.jpa.hibernate.ddl-auto=update : 테이블이 있어도 덮어서 테이블 생성

12. BoardController

  • list 요청 처리 메소드 작성

13. list.html


< 수업 순서 - 2024.10.08 >

01. BoardService : 메소드 추가

02. BoardServiceImpl

  • JpaRepository.findAll() : 테이블에 저장된 모든 행을 검색하여 List 객체로 반환하는 메소드 - 하나의 행은 Entity 객체로 변환하여 List 객체의 요소값으로 저장

  • for문 이용하여 boardEntityList를 boardDTOList로 변환

03. BoardEntity

  • Entity 객체를 DTO 객체로 변환하여 반환하는 메소드 - 검색 처리시 사용

04. BoardDTO

  • DTO 객체를 Entity 객체로 변환하여 반환하는 메소드
  • 삽입, 변경 처리시 사용

05. BoardController(수정)

  • list 요청 처리 메소드 작성

06. list.html

07. BoardController(수정)

  • detail 요청 처리 메소드 작성
  • num 매개변수
  • 글번호에 해당하는 게시물 하나 반환받아 board라는 이름으로 저장하여 전달

08. BoardService

  • getBoard() 메소드 작성

09. BoardServiceImpl

  • getBoard() 메소드 작성 오버라이드

  • Optional 객체 : 제네릭으로 설정된 클래스의 객체 대신 NULL이 저장될 경우 안전하게 처리하는 기능을 제공하는 객체 - NullPointerException 발생 방지

  • Optional.isPresent() : Optional 객체에 객체가 저장되어 있는 경우 [true]를 반환하는 메소드

  • Optional.empty() : Optional 객체에 NULL이 저장되어 있는 경우 [true]를 반환하는 메소드

  • Optional.get() : Optional 객체에 저장된 제네릭의 객체를 반환하는 메소드

  • 조회수를 증가하는 메소드 생성하여 getBoar에 추가

    • updateHit() 메소드 : BoardRepository에 작성

10. BoardRepository

  • @Modfiying : JPQL를 사용해 메소드에 insert, update, delete 명령을 등록하기 위한 어노테이션

    • 명령 작성 시 @Modifying 어노테이션 미사용 시 예외 발생
  • @Query : JPQL(Java Persistence Query Language)를 사용해 추상메소드에 SQL 명령을 등록하는 어노테이션

    • JPQL : 객체 지향 쿼리 언어로 Entity 객체를 기반으로 SQL 명령 작성하여 메소드에 등록
      → 복잡한 SQL 명령을 등록할 경우 QueryDSL(Query Domain-Specific Language) 사용
    • select명령만 등록하며 @Modifying 어노테이션을 사용하면 Insert, update, delete 명령 등록 가능
    • value 속성 : Entity 객체를 기반으로 작성된 SQL 명령을 속성값으로 설정 - 메소드 매개변수로 전달받은 값을 [:변수명] 형식으로 SQL 명령에서 사용 가능
  • @Param : @Query 어노테이션으로 등록된 SQL 명령에 매개변수에 저장된 값을 제공하기 위한 어노테이션

    • value 속성 : SQL 명령에서 사용하기 위한 변수명을 속성값으로 설정

11. detail.html

  • getBoard 메소드에서 행을 먼저 검색한 뒤 조회수 update를 하기 때문에 detail에서 조회수 표시는 +1을 해서 출력

  • inline 속성 : css 태그 또는 javascript 태그에서 인라인 표현식을 사용하기 위한 속성


< 수업 순서 - 2024.10.10 >

⭐게시글 수정

01. detail.html

  • modifyBtn 클릭 시 동작 : inline 표현식을 사용해 board.num 값을 전달
  • Btn 클릭 시 동작 함수 작성

02. modify.html : write와 유사

  • num, hit 값 hidden으로 전달
  • th:value 속성으로 작성되어있는 writer, title, content값 전달

03. BoardController(수정)

  • GET 방식으로 modify 페이지 요청시 요청되는 메소드 작성 : modify - 매개변수 num값
  • num값으로 검색한 board 행을 modify 페이지에 전달

04. BoardService 인터페이스

  • void modifyBoard(BoardDTO boardDTO) 메소드 작성

05. BoardServiceImpl

  • void modifyBoard(BoardDTO boardDTO) 오버라이드 하여 동작 작성
  • boardRepository의 save() 메소드 사용 : save(Entity entity) 메소드는 매개변수를 Entity 객체로 작성해야해서 DTO 객체를 Entity 객체로 변환하여 저장해야한다.

06. BoardDTO

  • DTO 객체를 Entity 객체로 변환하여 반환하는 메소드 작성 - 수정
  • 삽입일 경우 num 값이 null이고 변경일 경우엔 num값이 있으므로 entity 객체에 num값과 hit 값을 변경

07. BoardController(수정)

  • POST 방식으로 modify 페이지 요청시 요청되는 메소드 작성
  • boardService의 modifyBoard() 메소드 요청하여 board 객체 수정
  • 리다이렉트로 detail 페이지로 num값 전달하여 이동

⭐게시글 삭제

08. BoardController(수정)

  • GET 방식으로 remove 페이지 요청시 요청되는 메소드 작성
  • num값 매개변수로 설정
  • boardService의 removeBoard() 메소드 호출
  • 리다이렉트로 list 페이지 이동

09. BoardService 인터페이스

  • void removeBoard(Long num) 메소드 작성

10. BoardServiceImpl

  • void removeBoard(Long num) 메소드 오버라이드하여 동작 작성
  • JpaRepository.deleteById(Long id) : 매개변수로 전달받은 식별자를 사용해 테이블에서 행을 삭제하는 메소드

< 수업 순서 - 2024.10.11 >

⭐페이징 처리

01. BoardController

0개의 댓글