commit
48299c6257
@ -0,0 +1,82 @@
|
||||
package egovframework.com.config;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import io.swagger.v3.oas.models.Components;
|
||||
import io.swagger.v3.oas.models.ExternalDocumentation;
|
||||
import io.swagger.v3.oas.models.OpenAPI;
|
||||
import io.swagger.v3.oas.models.info.Contact;
|
||||
import io.swagger.v3.oas.models.info.Info;
|
||||
import io.swagger.v3.oas.models.info.License;
|
||||
import io.swagger.v3.oas.models.media.Schema;
|
||||
import io.swagger.v3.oas.models.media.StringSchema;
|
||||
import io.swagger.v3.oas.models.security.SecurityScheme;
|
||||
|
||||
@Configuration
|
||||
public class OpenApiConfig {
|
||||
|
||||
private static final String API_NAME = "Simple Homepage Project API";
|
||||
private static final String API_VERSION = "4.2.0";
|
||||
private static final String API_DESCRIPTION = "심플홈페이지 프로젝트 명세서";
|
||||
|
||||
@Bean
|
||||
public OpenAPI api() {
|
||||
|
||||
Schema<?> searchBbsMap = new Schema<Map<String, String>>()
|
||||
.addProperty("bbsId", new StringSchema().example("BBSMSTR_AAAAAAAAAAAA"))
|
||||
.addProperty("pageIndex", new StringSchema().example("1"))
|
||||
.addProperty("searchCnd", new StringSchema().example("0"))
|
||||
.addProperty("searchWrd", new StringSchema().example(""));
|
||||
|
||||
Schema<?> searchMap = new Schema<Map<String, String>>()
|
||||
.addProperty("pageIndex", new StringSchema().example("1"))
|
||||
.addProperty("searchCnd", new StringSchema().example("0"))
|
||||
.addProperty("searchWrd", new StringSchema().example(""));
|
||||
|
||||
Schema<?> fileMap = new Schema<Map<String, String>>()
|
||||
.addProperty("atchFileId", new StringSchema().example(""))
|
||||
.addProperty("fileSn", new StringSchema().example("0"));
|
||||
|
||||
Schema<?> searchSchdulMap = new Schema<Map<String, String>>()
|
||||
.addProperty("schdulSe", new StringSchema().example(""))
|
||||
.addProperty("year", new StringSchema().example("2023"))
|
||||
.addProperty("month", new StringSchema().example("0"))
|
||||
.addProperty("date", new StringSchema().example("1"));
|
||||
|
||||
Schema<?> searchSchdulWeekMap = new Schema<Map<String, String>>()
|
||||
.addProperty("schdulSe", new StringSchema().example(""))
|
||||
.addProperty("year", new StringSchema().example("2023"))
|
||||
.addProperty("month", new StringSchema().example("0"))
|
||||
.addProperty("date", new StringSchema().example("1"))
|
||||
.addProperty("weekDay", new StringSchema().example("0"))
|
||||
.addProperty("weekOfMonth", new StringSchema().example("1"));
|
||||
|
||||
Schema<?> passwordMap = new Schema<Map<String, String>>()
|
||||
.addProperty("old_password", new StringSchema().example(""))
|
||||
.addProperty("new_password", new StringSchema().example(""));
|
||||
|
||||
return new OpenAPI()
|
||||
.info(new Info().title(API_NAME)
|
||||
.description(API_DESCRIPTION)
|
||||
.version(API_VERSION)
|
||||
.contact(new Contact().name("eGovFrame").url("https://www.egovframe.go.kr/").email("egovframesupport@gmail.com"))
|
||||
.license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0")))
|
||||
.components(new Components()
|
||||
.addSecuritySchemes("Authorization", new SecurityScheme()
|
||||
.name("Authorization")
|
||||
.type(SecurityScheme.Type.APIKEY)
|
||||
.in(SecurityScheme.In.HEADER))
|
||||
.addSchemas("searchBbsMap", searchBbsMap)
|
||||
.addSchemas("searchMap", searchMap)
|
||||
.addSchemas("fileMap", fileMap)
|
||||
.addSchemas("searchSchdulMap", searchSchdulMap)
|
||||
.addSchemas("searchSchdulWeekMap", searchSchdulWeekMap)
|
||||
.addSchemas("passwordMap", passwordMap))
|
||||
.externalDocs(new ExternalDocumentation()
|
||||
.description("Wiki Documentation")
|
||||
.url("https://github.com/eGovFramework/egovframe-template-simple-backend/wiki"));
|
||||
}
|
||||
}
|
||||
@ -1,91 +0,0 @@
|
||||
package egovframework.com.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.PathSelectors;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
//accessToken 입력 화면과 처리 라이브러리 추가(아래4줄)
|
||||
import springfox.documentation.spi.service.contexts.SecurityContext;
|
||||
import springfox.documentation.service.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author : 정완배
|
||||
* @since : 2023. 8. 9.
|
||||
* @version : 1.0
|
||||
*
|
||||
* @package : egovframework.com.config
|
||||
* @filename : SwaggerConfig.java
|
||||
* @modificationInformation
|
||||
*
|
||||
* <pre>
|
||||
* << 개정이력(Modification Information) >>
|
||||
*
|
||||
* 수정일 수정자 수정내용
|
||||
* ---------- ---------- ----------------------
|
||||
* 2023. 8. 9. 정완배 주석추가
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
*/
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
public class SwaggerConfig {
|
||||
|
||||
private static final String API_NAME = "Simple Homepage Project API";
|
||||
private static final String API_VERSION = "4.1.0";
|
||||
private static final String API_DESCRIPTION = "심플홈페이지 프로젝트 명세서";
|
||||
|
||||
@Bean
|
||||
public Docket api() {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.apiInfo(apiInfo())
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("egovframework"))
|
||||
.paths(PathSelectors.any())
|
||||
.build()
|
||||
.securityContexts(Arrays.asList(securityContext())) // 스웨그에서 컨텐츠 url 접근 시 인증처리를 위한 보안 규칙 호출
|
||||
.securitySchemes(Arrays.asList(apiKey())); // 스웨그 화면상단에 토큰값 입력하는 창 구조 호출, 여기에 배열로 추가 apiKey메서드를 입력가능
|
||||
}
|
||||
|
||||
// Authorization창에 Token값 입력 화면 구조
|
||||
private ApiKey apiKey() {
|
||||
return new ApiKey("Authorization", "Authorization", "header");
|
||||
}
|
||||
|
||||
// 스웨그에서 컨텐츠 url 접근 시 인증처리를 위한 보안 규칙 추가(아래)
|
||||
private SecurityContext securityContext() {
|
||||
return springfox
|
||||
.documentation
|
||||
.spi.service
|
||||
.contexts
|
||||
.SecurityContext
|
||||
.builder()
|
||||
.securityReferences(defaultAuth()).operationSelector(operationContext -> true).build();
|
||||
}
|
||||
|
||||
// 토큰 인증영역 배열리스트을 반환하는 매서드
|
||||
List<SecurityReference> defaultAuth() {
|
||||
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); // 인증영역 객체 생성
|
||||
AuthorizationScope[] authorizationScopeArray = new AuthorizationScope[1]; // 빈 배열 인증영역 객체 생성
|
||||
authorizationScopeArray[0] = authorizationScope; // 배열변수에 인증영역 객체 등록
|
||||
return Arrays.asList(new SecurityReference("Authorization", authorizationScopeArray)); // 여기에 배열로 추가 SecurityReference객체를 입력가능
|
||||
}
|
||||
|
||||
public ApiInfo apiInfo() {
|
||||
return new ApiInfoBuilder()
|
||||
.title(API_NAME)
|
||||
.version(API_VERSION)
|
||||
.description(API_DESCRIPTION)
|
||||
.contact(new Contact("eGovFrame", "https://www.egovframe.go.kr/", "egovframesupport@gmail.com"))
|
||||
.build();
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
Class-Path:
|
||||
|
||||
@ -1,71 +0,0 @@
|
||||
package egovframework.com;
|
||||
|
||||
import egovframework.com.cmm.EgovMessageSource;
|
||||
import egovframework.com.config.EgovConfigAppMsg;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.DynamicTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
||||
/**
|
||||
* fileName : EgovMessageSourceTest
|
||||
* author : crlee
|
||||
* date : 2023/05/05
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/05/05 crlee 최초 생성
|
||||
*/
|
||||
@SpringBootTest(classes = {EgovConfigAppMsg.class})
|
||||
public class EgovMessageSourceTest {
|
||||
|
||||
@Autowired
|
||||
EgovMessageSource egovMessageSource;
|
||||
|
||||
@TestFactory
|
||||
Stream<DynamicTest> messageTests() {
|
||||
List<Locale> locales = Arrays.asList(
|
||||
Locale.KOREA,
|
||||
Locale.US
|
||||
);
|
||||
|
||||
return locales.stream().map(locale -> DynamicTest.dynamicTest(
|
||||
"Message test with " + locale.getDisplayName(),
|
||||
() -> {
|
||||
String msgType = "fail.common.login";
|
||||
String expectedMessage = getMessageForLocale(locale);
|
||||
|
||||
Assertions.assertThat(
|
||||
egovMessageSource.getMessage(msgType, locale)
|
||||
).isEqualTo(expectedMessage);
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
private String getMessageForLocale(Locale locale) {
|
||||
if (locale == Locale.KOREA) {
|
||||
return "로그인 정보가 올바르지 않습니다.";
|
||||
} else if (locale == Locale.US) {
|
||||
return "login information is not correct";
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void enMessageTest(){
|
||||
String msgType = "fail.common.login";
|
||||
String expectedMessage = "login information is not correct";
|
||||
Assertions.assertThat( egovMessageSource.getMessage(msgType, Locale.US) ).isEqualTo(expectedMessage);
|
||||
Assertions.assertThat( egovMessageSource.getMessage(msgType, Locale.UK) ).isEqualTo(expectedMessage);
|
||||
Assertions.assertThat( egovMessageSource.getMessage(msgType, Locale.ENGLISH) ).isEqualTo(expectedMessage);
|
||||
}
|
||||
}
|
||||
@ -1,38 +0,0 @@
|
||||
package egovframework.com;
|
||||
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
|
||||
/**
|
||||
* fileName : ProfileTestDev
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
@SpringBootTest
|
||||
@ActiveProfiles("dev")
|
||||
public class ProfileTestDev {
|
||||
|
||||
@Value("${Globals.DbType}")
|
||||
String dbType;
|
||||
|
||||
@Value("${Globals.OsType}")
|
||||
String osType;
|
||||
|
||||
@Value("${logging.rollingpolicy.maxHistory}")
|
||||
String maxHistory;
|
||||
|
||||
@Test
|
||||
void propertyTest() {
|
||||
Assertions.assertThat(dbType).isEqualTo("hsql");
|
||||
Assertions.assertThat(osType).isEqualTo("WINDOWS");
|
||||
Assertions.assertThat(maxHistory).isEqualTo("2");
|
||||
}
|
||||
}
|
||||
@ -1,37 +0,0 @@
|
||||
package egovframework.com;
|
||||
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
|
||||
/**
|
||||
* fileName : ProfileTestProd
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
@SpringBootTest
|
||||
@ActiveProfiles("prod")
|
||||
public class ProfileTestProd {
|
||||
|
||||
@Value("${Globals.DbType}")
|
||||
String dbType;
|
||||
|
||||
@Value("${Globals.OsType}")
|
||||
String osType;
|
||||
|
||||
@Value("${logging.rollingpolicy.maxHistory}")
|
||||
String maxHistory;
|
||||
@Test
|
||||
void propertyTest() {
|
||||
Assertions.assertThat(dbType).isEqualTo("hsql");
|
||||
Assertions.assertThat(osType).isEqualTo("LINUX");
|
||||
Assertions.assertThat(maxHistory).isEqualTo("90");
|
||||
}
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
package egovframework.let.cop.bbs.service;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* fileName : BoardTest
|
||||
* author : crlee
|
||||
* date : 2023/04/26
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/26 crlee 최초 생성
|
||||
*/
|
||||
|
||||
public class BoardTest{
|
||||
|
||||
@Test
|
||||
public void Board() {
|
||||
Board board = new Board();
|
||||
board.setBbsId("TestId");
|
||||
board.setFrstRegisterId("FrstId");
|
||||
board.setNttNo(3L);
|
||||
|
||||
org.junit.Assert.assertEquals( board.getBbsId() , "TestId" );
|
||||
org.junit.Assert.assertEquals( board.getFrstRegisterId() , "FrstId" );
|
||||
org.junit.Assert.assertEquals( board.getNttNo() , 3L );
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,32 +0,0 @@
|
||||
package egovframework.let.cop.bbs.service;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* fileName : BoardVOTest
|
||||
* author : crlee
|
||||
* date : 2023/04/26
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/26 crlee 최초 생성
|
||||
*/
|
||||
|
||||
public class BoardVOTest{
|
||||
|
||||
@Test
|
||||
public void BoardVo() {
|
||||
BoardVO boardVO = new BoardVO();
|
||||
boardVO.setBbsId("TestId");
|
||||
boardVO.setBbsNm("게시판nm");
|
||||
boardVO.setFrstRegisterId("FrstId");
|
||||
boardVO.setNttNo(3L);
|
||||
|
||||
|
||||
org.junit.Assert.assertEquals( boardVO.getBbsId() , "TestId" );
|
||||
org.junit.Assert.assertEquals( boardVO.getFrstRegisterId() , "FrstId" );
|
||||
org.junit.Assert.assertEquals( boardVO.getNttNo() , 3L );
|
||||
org.junit.Assert.assertEquals( boardVO.getBbsNm() , "게시판nm" );
|
||||
}
|
||||
}
|
||||
@ -1,101 +0,0 @@
|
||||
package egovframework.let.uat.uia.web;
|
||||
|
||||
import egovframework.com.cmm.ResponseCode;
|
||||
import egovframework.com.cmm.service.ResultVO;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.web.client.TestRestTemplate;
|
||||
import org.springframework.boot.test.web.server.LocalServerPort;
|
||||
import org.springframework.http.*;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* fileName : EgovLoginApiContollerTest
|
||||
* author : crlee
|
||||
* date : 2023/06/19
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/06/19 crlee 최초 생성
|
||||
*/
|
||||
@TestInstance(TestInstance. Lifecycle.PER_CLASS)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
public class EgovLoginApiControllerTest {
|
||||
|
||||
@Value("${server.servlet.context-path}")
|
||||
String CONTEXT_PATH;
|
||||
String URL = "http://localhost";
|
||||
|
||||
@LocalServerPort
|
||||
int randomServerPort;
|
||||
String SERVER_URL;
|
||||
|
||||
@BeforeAll
|
||||
void init(){
|
||||
this.SERVER_URL = String.format("%s:%s%s", URL,randomServerPort,CONTEXT_PATH);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@DisplayName("인증 성공")
|
||||
void hasToken(){
|
||||
String token = getToken();
|
||||
ResponseEntity<ResultVO> result = callApi(token);
|
||||
Assertions.assertThat( result.getStatusCode() ).isEqualTo( HttpStatus.OK );
|
||||
Assertions.assertThat( result.getBody().getResultCode() ).isEqualTo( ResponseCode.SUCCESS.getCode() );
|
||||
Assertions.assertThat( result.getBody().getResultMessage() ).isEqualTo( ResponseCode.SUCCESS.getMessage() );
|
||||
}
|
||||
@Test
|
||||
@DisplayName("인증 실패 - Token null")
|
||||
void noToken(){
|
||||
ResponseEntity<ResultVO> result = callApi(null);
|
||||
Assertions.assertThat( result.getStatusCode() ).isEqualTo( HttpStatus.UNAUTHORIZED );
|
||||
Assertions.assertThat( result.getBody().getResultCode() ).isEqualTo( ResponseCode.AUTH_ERROR.getCode() );
|
||||
Assertions.assertThat( result.getBody().getResultMessage() ).isEqualTo( ResponseCode.AUTH_ERROR.getMessage() );
|
||||
}
|
||||
@Test
|
||||
@DisplayName("인증 실패 - Wrong Token")
|
||||
void wrongToken(){
|
||||
ResponseEntity<ResultVO> result = callApi("123123123123123T&*#$SDF123");
|
||||
Assertions.assertThat( result.getStatusCode() ).isEqualTo( HttpStatus.UNAUTHORIZED );
|
||||
Assertions.assertThat( result.getBody().getResultCode() ).isEqualTo( ResponseCode.AUTH_ERROR.getCode() );
|
||||
Assertions.assertThat( result.getBody().getResultMessage() ).isEqualTo( ResponseCode.AUTH_ERROR.getMessage() );
|
||||
}
|
||||
String getToken(){
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
|
||||
Map<String,Object> params = new HashMap<>();
|
||||
params.put("id","admin");
|
||||
params.put("password","1");
|
||||
params.put("userSe","USR");
|
||||
|
||||
HttpEntity request = new HttpEntity(params,headers);
|
||||
TestRestTemplate rest = new TestRestTemplate();
|
||||
|
||||
ResponseEntity<HashMap> res = rest.exchange(this.SERVER_URL + "/auth/login-jwt", HttpMethod.POST,request , HashMap.class);
|
||||
assertThat( res.getStatusCode() ).isEqualTo( HttpStatus.OK );
|
||||
|
||||
HashMap<String,Object> body = (HashMap<String,Object>) res.getBody();
|
||||
assertThat( body.get("jToken") ).isNotNull();
|
||||
assertThat( body.get("resultCode") ).isEqualTo("200");
|
||||
assertThat( body.get("resultMessage") ).isEqualTo("성공 !!!");
|
||||
String token = body.get("jToken").toString();
|
||||
return token;
|
||||
}
|
||||
ResponseEntity<ResultVO> callApi(String token){
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", token);
|
||||
HttpEntity request = new HttpEntity(headers);
|
||||
TestRestTemplate rest = new TestRestTemplate();
|
||||
|
||||
return rest.exchange(this.SERVER_URL + "/uat/esm/jwtAuthAPI.do", HttpMethod.POST, request,ResultVO.class);
|
||||
}
|
||||
}
|
||||
@ -1,170 +0,0 @@
|
||||
package egovframework.study.jpa;
|
||||
|
||||
import egovframework.study.jpa.domain.Locker;
|
||||
import egovframework.study.jpa.domain.Member;
|
||||
import egovframework.study.jpa.domain.Team;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
|
||||
import javax.persistence.*;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Root;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* fileName : jpaTest
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
@DataJpaTest
|
||||
@TestInstance(TestInstance. Lifecycle.PER_CLASS)
|
||||
public class JpaTest {
|
||||
|
||||
@PersistenceUnit
|
||||
EntityManagerFactory emf; //엔티티 매니저 팩토리 생성
|
||||
EntityManager em;
|
||||
EntityTransaction tx;
|
||||
|
||||
@BeforeAll
|
||||
public void init(){
|
||||
this.em = emf.createEntityManager();
|
||||
}
|
||||
@BeforeEach
|
||||
public void open(){
|
||||
this.tx = em.getTransaction();
|
||||
this.tx.begin(); //트랜잭션 시작
|
||||
this.setData();
|
||||
}
|
||||
@AfterEach
|
||||
public void close(){
|
||||
this.tx.rollback();
|
||||
}
|
||||
@AfterAll
|
||||
public void end(){
|
||||
this.em.close(); //엔티티 매니저 종료
|
||||
this.emf.close();
|
||||
}
|
||||
void setData(){
|
||||
Team team1 = Team.builder()
|
||||
.id("team1")
|
||||
.name("team_name1")
|
||||
.build();
|
||||
em.persist(team1);
|
||||
|
||||
for (int i=1 ; i<30 ; i++ ){
|
||||
|
||||
em.persist(
|
||||
Member.builder()
|
||||
.id("member_id"+i)
|
||||
.username("member_name"+i)
|
||||
.age(2)
|
||||
.team(team1)
|
||||
.build()
|
||||
);
|
||||
|
||||
}
|
||||
em.flush();
|
||||
em.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("기본 select 작업을 테스트")
|
||||
void testSelectById(){
|
||||
Member findMember = em.find(Member.class,"member_id1");
|
||||
Assertions.assertThat( findMember.getUsername() ).isEqualTo( "member_name1" );
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
@DisplayName("기본 update 작업 테스트")
|
||||
void testUpdate(){
|
||||
Member updateMember = Member.builder()
|
||||
.id("member_id1")
|
||||
.username("UPDATE_NAME1")
|
||||
.age(20)
|
||||
.build();
|
||||
em.persist( updateMember );
|
||||
|
||||
Member findMember = em.find(Member.class,"member_id1");
|
||||
Assertions.assertThat( findMember.getUsername() ).isEqualTo( updateMember.getUsername() );
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("변경감지 Update Test")
|
||||
void testDirtyChecking(){
|
||||
Member updateMember = em.find(Member.class,"member_id1");
|
||||
updateMember.setUsername("UPDATE_NAME");
|
||||
|
||||
Member findMember = em.find(Member.class,"member_id1");
|
||||
Assertions.assertThat( findMember.getUsername() ).isEqualTo( updateMember.getUsername() );
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("객체 그래프 Test")
|
||||
void fetchTest(){
|
||||
Member findMember = em.find(Member.class,"member_id1");
|
||||
Assertions.assertThat( findMember.getTeam().getName() ).isEqualTo( "team_name1" );
|
||||
|
||||
Team findTeam = em.find(Team.class,"team1");
|
||||
Assertions.assertThat( findTeam.getName() ).isEqualTo( "team_name1" );
|
||||
Assertions.assertThat( findTeam.getMembers().size() ).isEqualTo( 29 );
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("cascade Test")
|
||||
public void cascadeTest(){
|
||||
Member member1 = Member.builder()
|
||||
.id("mem1")
|
||||
.username("name1")
|
||||
.age(1)
|
||||
.build();
|
||||
Locker locker1 = Locker.builder().id(1L).name("LockerNm1").member(member1).build();
|
||||
em.persist(locker1);
|
||||
// Member는 persist()하지 않았지만 영속상태
|
||||
Assertions.assertThat( em.contains(member1) ).isTrue();
|
||||
Assertions.assertThat( em.contains(locker1) ).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("select * from member;")
|
||||
void ParameterTest(){
|
||||
TypedQuery query = em.createQuery( "select m from Member m where m.username = :username" , Member.class );
|
||||
query.setParameter("username" , "member_name1" );
|
||||
List<Member> resultList = query.getResultList();
|
||||
Assertions.assertThat( resultList.size() ).isEqualTo(1);
|
||||
Assertions.assertThat( resultList.get(0).getAge() ).isEqualTo(2);
|
||||
Assertions.assertThat( resultList.get(0).getId() ).isEqualTo("member_id1");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("select username from member;")
|
||||
void projectionTest(){
|
||||
Query query = em.createQuery( "select m.username from Member m where m.username = :username");
|
||||
query.setParameter("username" , "member_name1" );
|
||||
List<String> resultList = query.getResultList();
|
||||
Assertions.assertThat( resultList.get(0) ).isEqualTo("member_name1");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("Criteria Test ")
|
||||
void CriteriaTest(){
|
||||
// 사용 준비
|
||||
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
|
||||
CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class);
|
||||
|
||||
// 루트 클래스( 조회를 시작할 클래스 )
|
||||
Root<Member> memberRoot = query.from(Member.class);
|
||||
|
||||
// 쿼리 생성
|
||||
CriteriaQuery<Member> criteriaQuery = query.select(memberRoot).where( criteriaBuilder.equal( memberRoot.get("age"),2 ) );
|
||||
List<Member> resultList = em.createQuery(criteriaQuery).getResultList();
|
||||
Assertions.assertThat( resultList.size() ).isEqualTo( 29 );
|
||||
}
|
||||
}
|
||||
@ -1,112 +0,0 @@
|
||||
package egovframework.study.jpa;
|
||||
|
||||
import com.querydsl.core.BooleanBuilder;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
import egovframework.study.jpa.domain.Member;
|
||||
import egovframework.study.jpa.domain.QMember;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* fileName : QueryDslTest
|
||||
* author : crlee
|
||||
* date : 2023/05/21
|
||||
* description : Query DSL 테스트 코드
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/05/21 crlee 최초 생성
|
||||
*/
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DataJpaTest
|
||||
@Transactional
|
||||
public class QueryDslTest {
|
||||
|
||||
@Autowired
|
||||
private TestEntityManager entityManager;
|
||||
|
||||
private JPAQueryFactory queryFactory;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
queryFactory = new JPAQueryFactory(entityManager.getEntityManager());
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("QueryDSL로 selectList")
|
||||
public void testSelectList() {
|
||||
insertTestMembers(30);
|
||||
|
||||
QMember member = QMember.member;
|
||||
List<Member> members = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.age.between(10, 15))
|
||||
.orderBy(member.username.asc())
|
||||
.fetch();
|
||||
|
||||
assertThat(members.size()).isEqualTo(6);
|
||||
assertThat(members.get(0).getUsername()).isEqualTo("member_name10");
|
||||
assertThat(members.get(5).getUsername()).isEqualTo("member_name15");
|
||||
}
|
||||
|
||||
@Test
|
||||
@DisplayName("QueryDSL로 selectList - 동적")
|
||||
public void testSelectListDynamic() throws CloneNotSupportedException {
|
||||
insertTestMembers(30);
|
||||
|
||||
QMember member = QMember.member;
|
||||
BooleanBuilder builder = createAgeNameFilter(member, 10);
|
||||
|
||||
List<Member> members = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(builder)
|
||||
.fetch();
|
||||
|
||||
assertThat(members.size()).isEqualTo(1);
|
||||
assertThat(members.get(0).getUsername()).isEqualTo("member_name10");
|
||||
assertThat(members.get(0).getAge()).isEqualTo(10);
|
||||
}
|
||||
private BooleanBuilder createAgeNameFilter(QMember member, int age) {
|
||||
BooleanBuilder builder = new BooleanBuilder();
|
||||
|
||||
if (age == 10) {
|
||||
builder.and(member.age.eq(10));
|
||||
} else {
|
||||
builder.and(member.age.eq(15)).or(member.username.contains("member_name"));
|
||||
}
|
||||
return builder;
|
||||
}
|
||||
@Test
|
||||
@DisplayName("QueryDSL로 selectOne")
|
||||
public void testSelectOne() {
|
||||
insertTestMembers(5);
|
||||
|
||||
QMember member = QMember.member;
|
||||
Member members = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.age.eq(3))
|
||||
.fetchOne();
|
||||
|
||||
assertThat(members.getUsername()).isEqualTo("member_name3");
|
||||
assertThat(members.getAge()).isEqualTo(3);
|
||||
}
|
||||
|
||||
private void insertTestMembers(int count) {
|
||||
for (int i = 1; i <= count; i++) {
|
||||
entityManager.persist(Member.builder()
|
||||
.id("member_id" + i)
|
||||
.username("member_name" + i)
|
||||
.age(i)
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,36 +0,0 @@
|
||||
package egovframework.study.jpa.domain;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import javax.persistence.CascadeType;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToOne;
|
||||
|
||||
/**
|
||||
* fileName : Locker
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@ToString
|
||||
@Entity
|
||||
public class Locker {
|
||||
@Id
|
||||
private Long id;
|
||||
|
||||
private String name;
|
||||
|
||||
@Builder.Default
|
||||
@OneToOne(mappedBy = "locker" , cascade = CascadeType.PERSIST)
|
||||
private Member member = new Member();
|
||||
}
|
||||
@ -1,39 +0,0 @@
|
||||
package egovframework.study.jpa.domain;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import javax.persistence.*;
|
||||
|
||||
/**
|
||||
* fileName : Member
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@ToString(exclude = { "team" , "locker"})
|
||||
@Entity
|
||||
public class Member {
|
||||
@Id
|
||||
private String id;
|
||||
|
||||
private String username;
|
||||
|
||||
private int age;
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name="TEAM_ID")
|
||||
private Team team;
|
||||
|
||||
@OneToOne(fetch = FetchType.LAZY)
|
||||
@JoinColumn(name="LOCKER_ID")
|
||||
private Locker locker;
|
||||
|
||||
}
|
||||
@ -1,38 +0,0 @@
|
||||
package egovframework.study.jpa.domain;
|
||||
|
||||
import lombok.*;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.OneToMany;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* fileName : Team
|
||||
* author : crlee
|
||||
* date : 2023/04/28
|
||||
* description :
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2023/04/28 crlee 최초 생성
|
||||
*/
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
@ToString
|
||||
@Entity
|
||||
public class Team {
|
||||
@Id
|
||||
private String id;
|
||||
|
||||
private String name;
|
||||
@Builder.Default
|
||||
@OneToMany(mappedBy = "team")
|
||||
private List<Member> members = new ArrayList<Member>();
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue