일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 비전공
- expo
- 개발자
- 리엑트 네이티브
- 리엑트
- ffmpeg
- 자바
- Spring
- 프론트 엔드
- 비전공자
- react
- Java
- 코딩
- react-native
- 스프링
- 풀스택
- 상태관리
- spring boot
- 인스타그램
- react native
- Redux
- 국비 지원
- 스프링 부트
- 개발
- 프론트엔드
- 스타트업
- 클론코딩
- 풀스택 개발자
- 백엔드
- 국비지원
- Today
- Total
오티스의개발일기
[SPRING BOOT + REACT-NATIVE] (7) jpaRepository 를 사용하여 유저 데이터베이스에 저장하기 본문
[SPRING BOOT + REACT-NATIVE] (7) jpaRepository 를 사용하여 유저 데이터베이스에 저장하기
안되면 될때까지.. 2022. 12. 29. 16:22
< 이전글
다음글 >
오늘은 저번시간에 만든 컨트롤러와 서비스를 가지고 유저를 실제 데이터베이스에 저장해볼것이다.
데이터베이스에 만들기위해서는 repository 가 필요한데
repository 를 구현하는 방법은 여러가지가 있다
그중 우리는 오늘
jpaRepository 를 extends 해서 사용할것이고
또한가지는 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
요청이 정상적으로 이루어졌다 이제 db에 저장이 됬는지 확인해보자
의도한대로 데이터가 정상적으로 등록되었다.
이것으로 포스팅을 마치도록 하겠다.
그럼 다음시간에는 jpaQueryFactory 에대해 다뤄보겠다
아래 git 을 참고하기 바란다
https://github.com/1domybest/react-native-ig-clone.git
다음글 >