본문 바로가기
Study/Spring

회원 추가 기능 구현 | Spring Spring boot JPA Study

by M개발자 2022. 2. 7.
반응형

✔ Java 11

✔ Gradle 7

✔ Spring boot 2.6.3

회원 추가 기능 구현

1. UserRequestDto 추가

회원 추가 시 회원의 정보를 객체로 받아오기 위해 dto 생성

@Getter
@AllArgsConstructor // 생성자
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserRequestDto {

    @NotNull
    String user_id;
    @NotNull
    String user_password;
    @NotNull
    String user_name;

}

2. 파일 이름 중복되어 변경

같은 기능을 구현하여 한 사람당 개인 파일이 존재하는데, 엔티티의 이름은 같지만 패키지 이름은 달라서 상관없을 거라 생각했다.
그런데 컴파일 과정에서 이름이 겹친다는 오류가 생겨 이름이 겹치는 파일 이름에 자신의 이름을 추가하여 파일 이름을 변경했다.
Commit (#8) 파일 이름 변경

3. Controller - post 구현

@PostMapping("/")
    public void createUser(@RequestBody UserRequestDto userRequestDto){
        userService.createUser(userRequestDto);
    }

post를 사용하기에 어노테이션 @RequestBody를 사용하여 JSON 형식의 데이터를 받는다.

4. Service - 회원 추가 메소드

@Transactional
public void createUser(UserRequestDto userRequestDto){
    User user = User.createUser(userRequestDto.getUser_id(), userRequestDto.getUser_name(), userRequestDto.getUser_password());
    userRepository.save(user);
}

아이디를 자동으로 부여해주기 위해 User 엔티티에서 userRequestDto 데이터를 가지고 엔티티를 생성해준다. 그러면 해당 엔티티에 아이디가 자동 부여되어 한 레코드가 완성 된다.
그리고 null 값이 없는 user 엔티티를 CRUDRepository의 메소드인 save를 사용하여 추가해준다.
User > createUser

public static User createUser(String user_id, String user_name, String user_password) {
    User user = new User();
    user.user_id = user_id;
    user.user_name = user_name;
    user.user_password = user_password;
    return user;
}

5. Repository - save()

User save(User user);
  • User - 자료형, User 엔티티
  • save - 메소드 이름, CrudRepository 내장 메소드
  • (User user) - 매개변수, User 엔티티

문제점

이 상태로 돌렸을 때 npr 오류가 발생했다. 디버깅으로 하나하나 찍어보았을 때 json 데이터는 잘 들어왔는데, UserService가 null로 뜨는 것이었다.

수정 전

private UserService userService;

알고보니 먼저 주입을 해주어야 하는데 주입되지 않고 메소드가 실행이 되어 npr 오류가 발생한 것이었다.

수정 후

@RequiredArgsConstructor // 생성자 자동 생성
@RestController
@RequestMapping("/users")
public class UserController {

    private final UserService userService;
		
		...
}

UserService에 final을 붙이고 생성자는 어노테이션 @RequiredArgsConstructor를 사용하여 자동 생성되게 했다.

6. H2 DB 추가

추후 MySQL 연동을 할 예정이라 간단히 application에서 연동만 하였다.

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driverClassName: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true
    path: /h2-console
    profiles:
      active: local

 


2차 회의록

 

반응형

댓글