오티스의개발일기

[SPRING BOOT + REACT-NATIVE] (7) jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 본문

개발/spring boot

[SPRING BOOT + REACT-NATIVE] (7) jpaRepository 를 사용하여 유저 데이터베이스에 저장하기

안되면 될때까지.. 2022. 12. 29. 16:22
728x90

 

 


< 이전글

2022.12.29 - [분류 전체보기] - [SPRING BOOT + REACT NATIVE] 인스타그램 클론 코딩 (6) aop 와 customException 설정하기 -git 참조-

 

[SPRING BOOT + REACT NATIVE] 인스타그램 클론 코딩 (6) aop 와 customException 설정하기 -git 참조-

< 이전글 2022.12.27 - [개발/spring boot] - [SPRING BOOT + REACT NATIVE] 인스타그램 클론 만들기 (5) spring boot 유저 도메인과 컨트롤러 만들기 [SPRING BOOT + REACT NATIVE] 인스타그램 클론 만들기 (5) spring boot 유저

otis.tistory.com



다음글 >

2022.12.29 - [개발/spring boot] - [SPRING BOOT + REACT-NATIVE] (8) jpaQueryFactory 와 queryDsl 를 사용하여 이메일 중복확인 기능 만들기 -git 첨부 -

 

[SPRING BOOT + REACT-NATIVE] (8) jpaQueryFactory 와 queryDsl 를 사용하여 이메일 중복확인 기능 만들기 -git 첨

< 이전글 2022.12.29 - [개발/spring boot] - [SPRING BOOT + REACT-NATIVE] jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 [SPRING BOOT + REACT-NATIVE] jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 오

otis.tistory.com


 

오늘은 저번시간에 만든 컨트롤러와 서비스를 가지고 유저를 실제 데이터베이스에 저장해볼것이다.

 

데이터베이스에 만들기위해서는 repository 가 필요한데

repository 를 구현하는 방법은 여러가지가 있다

 

그중 우리는 오늘

 

jpaRepositoryextends 해서 사용할것이고 

또한가지는 jpaQueryFactory 라는것을 사용해 querydsl 형식으로 repository 를 구현할 예정이다.

 

일단 오늘은 jpaRepository 로 받은 파라미터를 데이터에 저장하는 예제를 만들것이고

다음 포스팅은 jpaQueryFactory 를 사용하여 아이디 중복확인을 구현해볼것이다. 또한 중복이 됬을시 저번시간에 만든

customApiException 을 활용하여 원하는 메시지로 반환을 해줄것이다.

 

시작해보자

 

 

 

# 0 . 폴더 구조

 

# 1 . application.yml 설정

 

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/instagram?serverTimezone=Asia/Seoul
    username: user
    password: '1234'
  mvc:
    pathmatch:
      matching-strategy: path_pattern_parser
  jpa:
    hibernate:
      ddl-auto: create # <-- 매 서버 실행때마다 테이블이 삭제됬다가 다시 만들어짐 당연히 데이터 역시 날라감 하지만 테스트용으로 잠시 씀
    properties:
      hibernate:
        format_sql: true # <-- 실행쿼리를 가독성있게 표현
        show-sql: true # <-- 콘솔에 jpa 실행쿼리
    generate-ddl: true # < -- true로 설정 시, Entity 어노테이션(@Entity)이 명시된 클래스를 찾아서 ddl을 생성하고 실행

 

spring.jpa.hiberante.ddl-auto 속성

  • 옵션
    - none: 자동 생성하지 않음
    • create: 항상 다시 생성
    • create-drop: 시작 시 생성 후 종료 시 제거
    • update: 시작 시 Entity 클래스와 DB 스키마 구조를 비교해서 DB쪽에 생성되지 않은 테이블, 컬럼 추가 (제거는 하지 않음)
    • validate: 시작 시 Entity 클래스와 DB 스키마 구조를 비교해서 같은지만 확인 (다르면 예외 발생)

 

# 2 . UserRepository.java 생성

package com.example.backend.repository.user;

import com.example.backend.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

 

 

너무 간단하다 extens 로 JpaRepository 만 기입하고 자신이 사용한 엔티티와 id의 타입 을 적어주면된다

저기 적혀있는 id 는 예전에 만든 User.java 엔티티의 id (pk) 부분의 타입을 뜻한다

 

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Data
@Builder
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "userNo")
    private Long no; // pk

 

 

이제 서비스 부분에 user 를 추가시켜보자

 

# 3 . UserService.java 에 회원가입 로직 추가

package com.example.backend.service;

import com.example.backend.common.exception.CustomApiException;
import com.example.backend.domain.User;
import com.example.backend.dto.user.request.RequestUserRegisterDto;
import com.example.backend.repository.user.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    @Transactional(readOnly = false)
    public void register (RequestUserRegisterDto requestUserRegisterDto) {
        User user = requestUserRegisterDto.toEntity();
        userRepository.save(user);
    }
}

 

 

위에서 만든 userRepository 를 호출 해주고 user save 해준다 

sava는 어디서왔나???

jpaRepository 에서 제공해주는 기본 메서드이다. 

궁금한사람은 extends 한 jpaRepository 를 클릭해서 확인해보자

 

그리고 또한 

메서드 위에

@Transactional(readOnly = false)

이게 보일것이다

저 어노테이션은 간단하게 말하면 

메모리를 관리해준다 생각하면된다

본인도 완전 정확하게는 알지못하지만

 

db에 어떤 데이터를 저장할떄

혹시 오류가 나거나 그런 예외가 발생하면 db에 저장됬던걸 저 transactional 이 rollback 해준다

잘못된 정보가 db에 저장되면 안되는건 당연한거고 그걸 관리해준다 생각하면된다

또한 readyOnly 가 = true 일때는 우리가 데이터수정없이 뽑아쓸때 사용하면된다.

 

한마디로 데이터를 뽑아쓸때 transactional 을 사용한다면 메모리 낭비가 될수있으니

데이터를 create update delete 할때 false

데이터를 read 할때 True

로 사용하면된다

 

기본적으로 아무것도 안적어주면 default 값은 readOnly=false 이다

 

 

 

# 4 . UserController 수정

package com.example.backend.controller;

import com.example.backend.common.exception.CustomApiException;
import com.example.backend.dto.CMRespDto;
import com.example.backend.dto.user.request.RequestUserRegisterDto;
import com.example.backend.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequiredArgsConstructor
@CrossOrigin(origins = {"*"})
@RequestMapping("/api/user")
public class UserController {

    private final UserService userService;
    @PostMapping("/register")
    public CMRespDto<?> register (@Valid @RequestBody RequestUserRegisterDto requestUserRegisterDto) {
        userService.register(requestUserRegisterDto);
        return new CMRespDto<>(200, "회원 가입 완료", requestUserRegisterDto);
    }
}

 

위에서만든 service를 호출해주면 끝이난다.

 

 

이제 swagger2 를 활용하여 api 에 요청을 보내보자.

 

혹시 swagger2가 뭔지 모르는 사람은 아래 포스팅을 확인해보자

 

2022.12.29 - [개발/spring boot] - [SPRING BOOT] SWAGGER2 사용하여 api 테스터 만들기 postman 보다 편리한 swagger2

 

 

[SPRING BOOT] SWAGGER2 사용하여 api 테스터 만들기 postman 보다 편리한 swagger2

오늘은 post man 대신 swagger2 를 사용해보겠다. 일단 swagger 에대해 알아보자 swagger 란? 위키백과에 있는스웨거(Swagger)는 개발자가 REST 웹 서비스를 설계, 빌드, 문서화, 소비하는 일을 도와주는 대형

otis.tistory.com

 

 

 

 

 

 

 

 

요청이 정상적으로 이루어졌다 이제 db에 저장이 됬는지 확인해보자

의도한대로 데이터가 정상적으로 등록되었다.

 

 

 

 

이것으로 포스팅을 마치도록 하겠다.

 

그럼 다음시간에는 jpaQueryFactory 에대해 다뤄보겠다

아래 git 을 참고하기 바란다

 

https://github.com/1domybest/react-native-ig-clone.git

 

GitHub - 1domybest/react-native-ig-clone

Contribute to 1domybest/react-native-ig-clone development by creating an account on GitHub.

github.com


다음글 >

2022.12.29 - [개발/spring boot] - [SPRING BOOT + REACT-NATIVE] (8) jpaQueryFactory 와 queryDsl 를 사용하여 이메일 중복확인 기능 만들기 -git 첨부 -

 

[SPRING BOOT + REACT-NATIVE] (8) jpaQueryFactory 와 queryDsl 를 사용하여 이메일 중복확인 기능 만들기 -git 첨

< 이전글 2022.12.29 - [개발/spring boot] - [SPRING BOOT + REACT-NATIVE] jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 [SPRING BOOT + REACT-NATIVE] jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 오

otis.tistory.com


 

728x90
Comments