게시판 만들기 - 1
2021. 8. 11. 14:58ㆍ(구)공부/SpringBoot
728x90
junit 테스트로 db에 자료 넣고 페이징으로 불러오는데까지
properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jpadb?useUnicode=yes&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=1234
#spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
logging.level.org.hibernate=info
server.port=80
spring.thymeleaf.cache=false
logging.level.org.springframework.web=info
logging.level.com.bit=info
디자인 활용 https://html5boilerplate.com/
HTML5 ★ BOILERPLATE
The web’s most popular front-end template which helps you build fast, robust, and adaptable web apps or sites.
html5boilerplate.com
에서 다운 받은 뒤 resources/static 에 풀기
pom.xml
<!-- https://mvnrepository.com/artifact/nz.net.ultraq.thymeleaf/thymeleaf-layout-dialect -->
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
<version>2.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-jpa -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.querydsl/querydsl-apt -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>4.4.0</version>
</dependency>
<!-- target/generated-sources/java 에 파일이 자동으로 생김 -->
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
package controller, domain, persistence,vo 생성
controller
package com.bit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.java.Log;
@Controller
@RequestMapping("/boards")
@Log
public class WebBoardController {
@GetMapping("/list")
public void list() { //boards/list.html 호출
log.info("list() called");
}
}
domain
package com.bit.domain;
import java.sql.Timestamp;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
@Entity @Table(name = "tbl_webboards")
@EqualsAndHashCode(of="bno")
public class WebBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long bno;
private String title;
private String writer;
private String content;
@CreationTimestamp
private Timestamp regdate;
@UpdateTimestamp
private Timestamp updatedate;
}
persistence
package com.bit.persistence;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;
import org.springframework.data.repository.CrudRepository;
import com.bit.domain.QWebBoard;
import com.bit.domain.WebBoard;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.types.Predicate;
public interface WebBoardRepository extends CrudRepository<WebBoard, Long>, QuerydslPredicateExecutor<WebBoard>{
//java 8.0 : 디폴트 메소드 -> 오버라이딩하지 않으면 이 메소드 그대로 사용
public default Predicate makePredicate(String type, String keyword) {
BooleanBuilder builder = new BooleanBuilder();
QWebBoard board = QWebBoard.webBoard;
//bno>0
builder.and(board.bno.gt(0));
if(type==null) {
return builder;
}
//검색 로직
return builder;
}
}
src/test/java
package com.bit;
import java.util.stream.IntStream;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.test.annotation.Commit;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.data.domain.Page;
import com.bit.domain.WebBoard;
import com.bit.persistence.WebBoardRepository;
import com.querydsl.core.types.dsl.StringExpression;
import lombok.extern.java.Log;
@ExtendWith(SpringExtension.class)
@SpringBootTest
@Log
@Commit
public class WebBoardRepositoryTests {
@Autowired
WebBoardRepository repo;
@Test
public void insertBoardDummies() {
IntStream.range(0, 300).forEach(i->{
WebBoard board = new WebBoard();
board.setTitle("Sample Board Title " + i);
board.setContent("Content Sample ..." + i + " of Board ");
board.setWriter("user0"+(i%10));
// repo.save(board);
});
}
@Test
public void testList1() {
Pageable paging = PageRequest.of(1, 20,Direction.DESC,"bno");
Page<WebBoard> result =
repo.findAll(repo.makePredicate(null, null),paging);
log.info("PAGE: "+result.getPageable());
log.info("---------------------------------------");
log.info("PageNumber : " + result.getPageable().getPageNumber());
log.info("TotalPages : " + result.getTotalPages());
log.info("" + result.getPageable());
log.info("---------------------------------------");
result.getContent().forEach(board->log.info(""+board));
}
}
728x90
'(구)공부 > SpringBoot' 카테고리의 다른 글
게시판 - 3 (수정,삭제) 최종 (1) | 2021.08.14 |
---|---|
게시판 만들기 - 2(페이징) (2) | 2021.08.12 |
Thymeleaf 입문 (0) | 2021.08.10 |
JPA 다양한 select 메소드 (0) | 2021.08.06 |
JUnit (0) | 2021.08.05 |