자(바어)린(이)입니다. 혹 틀린내용이 있을시 피드백 해주시면 혼또니 감사드리겠습니다.
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
|
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(1, 101).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마바사
댓글