게시판 만들기 - 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