본문 바로가기
JAVA

땅꼬마의 Springboot3 + JPA 구현하기!

by 땅꼬마개발자 2023. 7. 25.

어제에 이어서 구현하는 예제를 만들어서 실습!

 

개발환경은

Springboot 3.0.9 / java 17 / mysql / intellij community 버전

 

1. 프로젝트 생성 및 디렉토리 구조

프로젝트는 Springboot initializr (https://start.spring.io/) 를 통해서 생성하였다.

기본적인 Spring web, 롬복, mysql 등 추가해서 생성 -> 아래 gradle.build 예시 확인

 

디렉토리구조

- common : 공통적으로 사용할 dto, exception처리, 후에 공통유틸 등 관하는 디렉토리

-domain : entity와 repository 관리

-각각서비스디렉토리 : 서비스명 하위에 controller, service, dao 두어 서비스별로 관리

 

-->대략적인 구조는 이렇게 가져가려 한다.

 

 

 

 

 

 

 

2. 설정

application.yml

#local
spring:
  profiles:
    activate:
      on-profile: local

  # database
  datasource:
    url: jdbc:mysql://localhost:3306/스키마명?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Seoul
    username: 아이디
    password: 비밀번호
    driver-class-name: com.mysql.cj.jdbc.Driver

    # jpa
    jpa:
      show-sql: true
      hibernate:
        ddl-auto: none
        naming:
          physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      properties:
        hibernate:
          dialect: org.hibernate.dialect.MySQLDialect
          format_sql: true

#encoding
server:
  servlet:
    encoding:
      charset: UTF-8

 

1. LOCAL / DEV / QA / MASTER 로 분리하기 위해 profile 설정을 했다.

2. DB는 mysql이며 시간위치설정, 인코딩설정, ssl설정 끔 등 처리함

3. JPA 설정 show-sql = true -> 로그에 sql문 보여줌 / ddl-auto -> DDL문을 자동으로 작성해주지만 안전을 위해 none으로 설정(*후에 설정 관련한 포스팅을 해야겠다)

 

build.gradle

 

buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.9'
	id 'io.spring.dependency-management' version '1.1.2'
}

group = '기본패키지경로'
version = '0.0.1'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	//Spring
	implementation 'org.springframework.boot:spring-boot-starter-web'

	//swagger
	implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

	//jpa
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.hibernate:hibernate-validator:7.0.5.Final'

	//mysql
	runtimeOnly 'com.mysql:mysql-connector-j:8.0.32'

	//lombok
	implementation  'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'

	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

기본 설정에서 dependencies에 사용할 친구들을 추가했다.

스프링부트3버전에서는 swagger config 설정없이 추가만하면 바로 swagger-ui로 접근 가능하다.

(*이전 포스팅 참고)

 

3.USER 저장 구현

-Entity.java

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "TBL_USER_M", schema = "testproj", catalog = "")
public class UserEntity {
    @Id
    @Column(name="USER_ID")
    private String userId;
    @Column(name="USER_NM")
    private String userNm;
    @Column(name="USER_PW")
    private String userPw;
    @Column(name="USER_TEL")
    private String userTel;
    @Column(name="POST")
    private String post;
    @Column(name="USER_ADDR1")
    private String userAddr1;
    @Column(name="USER_ADDR2")
    private String userAddr2;
}

-UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<UserEntity, String> {

}

-UserController.java

@RequiredArgsConstructor
@RestController
@RequestMapping(value="/api")
public class UserController {

    private final UserService userService;

    @PostMapping(value = "/user")
    public ResponseEntity<APIResponse> saveUser(@RequestBody RequestUserSave requestUserSave){
        return ResponseEntity.status(HttpStatus.OK).body(APIResponse.of(userService.saveUser(requestUserSave)));
    }
}

-UserService.java

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;
    @Transactional
    public boolean saveUser(RequestUserSave requestUserSave) {
        userRepository.save(requestUserSave.toEntity());
        return true;
    }
}

-RequestUserSave : 저장 요청 데이터를 담을 DTO를 만들어서 파라미터로 받았다.

-반환값은 업무중 구현해 놓은 리턴값들 정리한 공통부분 활용(리턴메세지)

 

정말 특별한거 없이 슉~ 하면 저장이 된다.

 

파라미터를 받아서 -> 서비스에서 엔터티로 변환 -> save() 메소드로 엔터티를 보내면 저장 완료!

 

<Swagger 화면 및 결과 캡처>

스웨거로 저장 요청
결과 리턴
DB 데이터 확인

 

다음 포스팅은 JPQL / Querydsl 을 보고 비교해보자!

 

*혹시 내용에 수정이 필요한 부분이 있으면 댓글로 남겨주세요 : )