본문 바로가기

개발일지

STS4 / JPA / swagger2 / H2 db연동 테스트 샘플 프로젝트 따라하기

728x90

2021.03.23 - [개발일지] - STS / Swagger2 / lombok / Gradle Project 환경 설정

 

STS / Swagger2 / lombok / Gradle Project 환경 설정

2년전에 SpringBoot / Swagger2 / lombok / Gradle Project 환경 설정 2. STS(SpringTollSuite) 환경설정  - Tomcat 다운로드 / Tomcat 서버 설정 하기 3. Gradle Project 생성 프로젝트 생성후 build.gradle..

csksoft.tistory.com

이전에 올린 환경설정에서 JPA를 연동하여 데이터베이스 연동 서비스를 추가하는 샘플 프로젝트를 연습니다.

우선은 H2 DB를 먼저 설치 합니다. 아래 블로그를 참고 하여 H2 데이터베이스를 설정합니다.

reference-m1.tistory.com/127

 

H2 DB 설치 및 설정

H2 DB H2 DB는 JAVA 기반의 오픈소스 RDBMS(관계형 데이터 베이스 관리 시스템)이다. H2 DB는 서버 모드와 임베디드 모드인 인메모리 DB 기능을 지원한다. 또한 디스크 기반 테이블을 생성할 수 있다. 브

reference-m1.tistory.com

H2 데이터베이스 다운로드

www.h2database.com/html/download.html

 

Downloads

Downloads Version 1.4.200 (2019-10-14) Windows Installer (SHA1 checksum: 12710a463318cf23c0e0e3f7d58a0f232bd39cfe) Platform-Independent Zip (SHA1 checksum: 5898966bbca0b29ee02602fb84e0eb90ec92eec2) Version 1.4.199 (2019-03-13), Last Stable Windows Installe

www.h2database.com

H2 데이터 베이스 테이블에 테스트할 샘플 스키마와 데이터를 설정함

// 스키마 생성

drop table member if exists;
drop sequence if exist hibernate_sequence;
create sequence hibernate_sequence start with 1 increment by 1;
create table member (id varchar(255) not null, email varchar(255), age int, primary key(id));

// 데이터 등록

INSERT INTO member( id, email, age ) VALUES 
  ('user01', 'user01@gmail.com', '21') 
, ('user02', 'user02@gmail.com', '30');

STS 에서 신규 프로젝트를 생성합니다.

 

build.gradle 파일 수정 후 Refresh Gradle Project 하려 라이브러리 갱신

plugins {
	id 'org.springframework.boot' version '2.4.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {

    // lombok 라이브러리
    compileOnly 'org.projectlombok:lombok:1.18.18'
    annotationProcessor 'org.projectlombok:lombok:1.18.18'
    
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web-services'
	implementation 'io.springfox:springfox-swagger2:2.6.0', 'io.springfox:springfox-swagger-ui:2.6.0'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}

application.properties  아래와 같이 작성합니다.

#H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.hikari.jdbc-url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=

#jpa
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true

지금부터 코딩 시작...

SwaggerConfig.java 작성

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any()) // 현재 RequestMapping으로 할당된 모든 URL 리스트를 추출
                .paths(PathSelectors.ant("/api/**")) // 그중 /api/** 인 URL들만 필터링
                .build();
    }
}

member 패키지를 추가 합니다.

Member.java 파일 생성

package com.example.demo.member;

import java.io.Serializable;
import javax.persistence.*;
import com.sun.istack.NotNull;

import io.swagger.annotations.ApiParam;
import lombok.Data;

@Data
@Entity
@Table(name = "member")
public class Member implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id // primary key
	@NotNull
	@ApiParam(value = "member ID", required = true)
	@Column(columnDefinition="varchar(255)", nullable = false, insertable=true, updatable=false)
	private String id;	

	@Column(columnDefinition="INT", nullable = false, insertable=true, updatable=true)
	@ApiParam(value = "member age", required = true)
	private int age;
	
	@Column(columnDefinition="varchar(255)", nullable = false, insertable=true, updatable=true)
	@ApiParam(value = "member email", required = true)
	private String email;	
}

memberController.java 파일 생성

package com.example.demo.member;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping("/api/member")
public class memberController {
	@Autowired
	MemberService memberService;
	
	ResponseEntity<?> entity = null;
	@ApiOperation(value="사용자 등록", notes="사용자 등록")
	@PostMapping(value="/register")
	public ResponseEntity<?> registerMember(@RequestBody Member member) {
		try {
			if(member != null) {
				memberService.save(member);
				entity = new ResponseEntity<String>("SUCCESS", HttpStatus.OK);
			}else {
				entity = new ResponseEntity<String>("NO DATA", HttpStatus.BAD_REQUEST);
			}
		}catch (Exception e) {
			e.printStackTrace();
			entity = new ResponseEntity<String>("Error", HttpStatus.BAD_REQUEST);
		}
		return entity;
	}
	
	@ApiOperation(value="사용자 조회", notes="사용자 조회")
    @RequestMapping("/search")
    public List<Member> search() {
        return memberService.findAll();
    }
}

MemberRepository.java 파일 생성

package com.example.demo.member;

import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long>{

}

MemberService.java 파일 생성

package com.example.demo.member;

import java.util.LinkedList;
import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {
	@Autowired
	private MemberRepository memberRepository;
	
	public void save(Member member) {
		LinkedList<Member> list = new  LinkedList<Member>();
		list.add(member);
		memberRepository.saveAll(list);
	}
	
	public List<Member> findAll() {
		return memberRepository.findAll();
	}
}

STS 실행하기 전에 H2 db 실행하여 먼저 확인 한다.

스프링 부트 실행하면 정상적으로 실행되는지 확인한다. 정상실행 확인

localhost:8080/swagger-ui.html  접속하여 확인합니다.

/api/member/search 하여 사용자 조회를 한번 해봅니다.

결과 데이터를 가져오는 것을 확인함

이제 실제 등록 테스트를 하고 h2 db에서 조회하여 데이터가 등록이 되었는지 확인 테스트

/api/member/register 서비스를 테스트 합니다.

데이터가 정상적으로 등록이 된것을 확인됩니다. 

이렇게 JPA 조회 / 등록 테스트를 완료합니다.

728x90