본문 바로가기
카테고리 없음

[Spring Boot] JPA를 이용한 간단한 게시판 만들기

by 소라소라잉 2019. 11. 29.

(바어)(이)입니다. 혹 틀린내용이 있을시 피드백 해주시면 혼또니 감사드리겠습니다.  

 

 

1. 프로젝트 생성(Ctrl+Shift+P)

>Spring Initializr: Generate a Maven Project

>Language 설정(Java)

> 패키지명 설정(org.ms)

> Artifact 설정(msp)

> Boot version 2.2.1

> dependencies 설정(4개 : Spring Boot DevTools, Lombok, Spring Web, Spring Data JPA) 

> worckspace 폴더선택 

 

 

2. pom.xml dependency 추가설정(JDBC(MariaDB), QueryDsl)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
        <dependency>
               <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
              <version>2.5.2</version>
        </dependency>
 
    <!-- QueryDsl 관련 라이브러리 2개-->
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
        </dependency>
 
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
        </dependency>
cs

* QueryDsl : 설명 추가할것. 개념& 어디에 쓸건지 

 

 

3. application.properties 설정 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3307/bootex
spring.datasource.username=boot_user
spring.datasource.password=1234
 
logging.level.org.ms=info
 
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true
 
spring.data.web.pageable.default-page-size=20 
spring.data.web.pageable.max-page-size=200
spring.data.web.pageable.one-indexed-parameters=true 
spring.data.web.pageable.page-parameter=page
cs

 

* Spring Boot에는 다양한 설정 파일을 제공하고 있는데 대표적으로 .properties, .yml 등이 있다. .xml도 설정파일로 작성할 수 있지만 앞의 두 형식의 파일을 자주 쓴다. 

 

* Hibernate 초기화(참고 : https://pravusid.kr/java/2018/10/10/spring-database-initialization.html)

Spring-data-JPA와 DBMS를 연결해서 사용할 때 개발환경의 변경사항을 적용시켜 간편히 테스트 할 수 있다.  

Spring은 EntityScan을 통해 @Entity 애너테이션이 명시한 클래스를 찾는데, 

spring.jpa.generate-ddl=true옵션을 true로 설정하면 해당 데이터를 근거로 서버 시작 시점에 DDL문을 생성하여 DB에 적용한다. jpa.generate 설정은 JPA 구현체 DDL생성 옵션의 링크이고 true/false밖에 선택할 수 없다. 

나는 구현체로 Hiberante를 사용했기 때문에 spring.jpa.giberante.ddl-auto 옵션을 통해 초기화 전략을 설정했다. 

=> spring.jpa.hibernate.ddl-auto=update

  • none: 아무것도 실행하지 않는다 (대부분의 DB에서 기본값이다)
  • create-drop: SessionFactory가 시작될 때 drop및 생성을 실행하고, SessionFactory가 종료될 때 drop을 실행한다 (in-memory DB의 경우 기본값이다)
  • create: SessionFactory가 시작될 때 데이터베이스 drop을 실행하고 생성된 DDL을 실행한다
  • update: 변경된 스키마를 적용한다
  • validate: 변경된 스키마가 있다면 변경점을 출력하고 애플리케이션을 종료한다

 

4. domain 생성 - Board

기본적인 게시판구현이 목적이기 때문에 일단 Board class를 생성한다. 

> src.java.org.ms.msp 하위에 domain 패키지를 만들어 Board.java 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * Board Class
 */
 
@Entity
@Table(name = "ms_board")
@Data
public class Board {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer bno;
    private String title;
    private String writer;
    private String content;
    
}
cs

 

*

@Entity : DB 테이블과 1:1로 매칭되는 객체단위. 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미한다. 그래서 객체의 인스턴스를 구분하기 위한 유일한 키 값을 가지는데 이것은 테이블 상의 PK와 같은 의미를 가지며 @Id 애너테이션으로 정의된다. 

application.properties에서 설정한 hibernate.ddl-auto 설정에 따라(create 혹은 update로 되어있을 경우) 프로젝트가 시작될 때 EntityManager가 자동으로 DDL을 수행해 테이블을 생성해준다. 

이때 애너테이션 name속성을 지정해주면 데이터베이스에 생성될 테이블의 이름을 정할 수 있지만,

따로 @Table애너테이션으로 분리한 이유는 후에 Table애너테이션의 여러가지 속성(제약조건,인덱스 등 지정)을 이용 하기 위함이다. 

 

@Id : PK설정 애너테이션. 위 코드의 경우 bno를 PK로 설정했다. 

 

@GeneratedValue(strategy = GenerationType.IDENTITY) : PK를 자동으로 생성해주는 애너테이션, GenerationType을 IDENTITY로 설정하면 auto increment로 설정된다. 

 

 

5. BoardRepository 생성 및 Junit 테스트코드를 이용한 더미데이터 insert

1
2
3
4
5
6
/**
 * BoardRepository interface
 */
public interface BoardRepository extends JpaRepository<Board,Integer> {
    
}
cs

 

* extends JpaRepository<Board,Integer> 

Spring Data JPA에서 제공하는 JpaRepository 인터페이스는 기본적인 CRUD를 제공한다. 따라서 CRUD가 필요한 객체에는 JpaRepository 인터페이스를 상속받아 기본적인 CRUD 메서드를 이용할 수 있다. 

메서드 기능
save() 레코드 저장(insert, update)
findOne() pk로 레코드 불러오기
findAll() 전체 레코드 불러오기(정렬과 페이징가능)
count() 레코드 갯수 count
delete() 레코드 삭제

JpaRepository의 제네릭은 <T, ID>. 사용될 Entity클래스와 ID값을 넣어주면 된다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * BoardTests
 */
@SpringBootTest
public class BoardTests {
 
    @Autowired
    BoardRepository boardRepo;
 
    @Test
    public void insertDummy() {
 
        IntStream.range(1101).forEach(i -> {
            Board board = new Board();
            board.setTitle("Title"+i);
            board.setWriter("Writer"+i);
            board.setContent("Content"+i);
            boardRepo.save(board);
        });
    }    
}
cs

 

BoardRepository를 주입받아 더미데이터 삽입을 위한 테스트 코드를 실행 후 데이터가 잘 들어갔는지 확인한다.

 

6. Board의 페이징 처리 테스트

1
2
3
4
5
6
7
8
9
10
11
12
    @Test
    public void testPaging() {
 
        Pageable page = PageRequest.of(0,10,Sort.Direction.DESC,"bno");
        Page<Board> result = boardRepo.findAll(page);
        
        result.forEach(b-> {
            log.info("BNO : "+b.getBno());
            log.info("TITLE : "+b.getTitle());
            log.info("WRITER : "+b.getWriter());
        });
    }
cs

*

 

 

 

 

 

ㅇㅇㅇㅇ

 

 

ffff

 

 

 

 

 

r마바사

 

댓글