본문 바로가기

개발/프로젝트

[스프링부트 게시판] 8. 회원가입을 위한 JPA INSERT

이번 게시글에서 회원가입을 위한 데이터베이스에 사용자를 추가하는 JPA Insert에 대해 알아보고자 합니다.

 

 먼저 회원가입을 위한 테스트용 Controller 클래스 파일을 생성하겠습니다.

 

UserController

 

사용자 관련 컨트롤러인 UserController를 생성했습니다.

 

[UserController]

@RestController
public class UserController {
	@PostMapping("/user/join")
	public String join(String username, String password, String email) {
		System.out.println("username : " + username);
		System.out.println("password : " + password);
		System.out.println("email : " + email);
		return "회원가입이 완료되었습니다.";
	}
}

 

위의 코드로 구현 후, Postman에서 post 요청을 수행하여 데이터가 전달 되는지 확인합니다.

 

Postman
Console

 

정상적으로 데이터가 전달이 되었음을 확인 하실 수 있습니다. 다만, 위와 같이 각 변수로 갖고오는 것이 아닌 객체로 매핑하여 받아오도록 설정하겠습니다.

 

[UserController]

@RestController
public class UserController {
	@PostMapping("/user/join")
	public String join(User user) {
		System.out.println("id : " + user.getId());
		System.out.println("username : " + user.getUsername());
		System.out.println("password : " + user.getPassword());
		System.out.println("email : " + user.getEmail());
		System.out.println("role : " + user.getRole());
		System.out.println("regDt : " + user.getRegDt());
		System.out.println("modDt : " + user.getModDt());
		return "회원가입이 완료되었습니다.";
	}
}

Postman
Console

 

객체로 변경 후 정상적인 데이터 전달을 확인하였음으로 이제 JPA를 통한 데이터베이스 Insert 작업을 진행하겠습니다. 먼저 'repository' 라는 이름의 패키지를 생성하고 해당 패키지에 클래스가 아닌 인터페이스 파일을 생성하도록 합니다.

 

Interface

 

UserRepository

 

UserRepository 인터페이스 파일을 생성하였으면 옆에 extends JpaRepository<[사용자 객체], [사용자 테이블 기본키의 데이터 타입]>을 추가합니다. JpaRepository가 들어가있으면 단순한 CRUD(Create, Read, Update, Delete)는 처리가 가능합니다.

 

이제 다시 UserController로 돌아가 다음과 같은 의존관계 주입(Dependency Injection) 작업을 통해 해당 객체를 데이터베이스의 데이터를 저장하도록 설정합니다.

 

@RestController
public class UserController {
	
	@Autowired
	private UserRepository userRepository;
	
	@PostMapping("/user/join")
	public String join(User user) {
		System.out.println("id : " + user.getId());
		System.out.println("username : " + user.getUsername());
		System.out.println("password : " + user.getPassword());
		System.out.println("email : " + user.getEmail());
		System.out.println("role : " + user.getRole());
		System.out.println("regDt : " + user.getRegDt());
		System.out.println("modDt : " + user.getModDt());
		
		userRepository.save(user); // Insert 작업
		
		return "회원가입이 완료되었습니다.";
	}
}

 

여기서 의존관계 주입(DI, Dependency Injection)이란 무엇인가?

 

https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

 

의존관계 주입(Dependency Injection) 쉽게 이해하기

이번 글에서는 DI(의존성 주입, 의존관계 주입)의 개념을 설명한다.

tecoble.techcourse.co.kr

 

간단하게 말하자면,

의존대상 B가 변하면, 그것이 A에 영향을 미친다.

- 이일민, 토비의 스프링 3.1, 에이콘(2012), p113

즉, B의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다.

 

라는 의미를 지니고 있다. 여기서 UserRepositoryUserController 클래스 파일에서 의존관계 주입을 통해 @Autowired로 처리하였다.

 

여기에서 UserRepositorySave를 통해 객체에 맞는 변수명으로 필드명을 따라가 Insert 작업이 진행됩니다. 아까 Postman에서 Id를 제외한 나머지 내용으로 진행하도록 하겠습니다.

 

Postman
Console
DBeaver

 

정상적으로 데이터가 들어갔지만 기본적으로 생성이 되어야할 regDtrole에 대해서 아무런 값도 나타나지 않습니다. 이는 Postman에서 해당 데이터에 대해 null로 들어갔기 때문이지만 regDt의 경우는 다르기 때문에 아래 링크를 첨부하며 간단하게 설명을 드리겠습니다.

 

https://sowon-dev.github.io/2021/11/29/211130Jpa-auditing/

 

[JPA]@CreatedDate에 날짜가 안 담길때 오류

@CreatedDate를 사용하여 save()메서드로 데이터를 insert하는데 날짜가 null로 나왔다.이런 오류는 대부분 auditing이 제대로 적용되지 않았을때 발생한다.

sowon-dev.github.io

 

@CreatedDate를 사용하신다면 서버를 키기위한 ToyApplication 클래스 파일과 User 클래스 파일에

 

[ToyApplication]

@EnableJpaAuditing // CreatedDate를 위함
@SpringBootApplication
public class ToyProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(ToyProjectApplication.class, args);
	}

}

[User]

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@EntityListeners(AuditingEntityListener.class) // 추가
public class User {
	...
}

DBeaver

 

추가한 코드로 @CreateDate가 정상작동 하는 것을 확인 하실 수 있습니다. 그리고 role과 같은 값을 null처리를 위해 2가지 방법이 있습니다.

 

(1) @DynamicInsert

 

 

@DynamicInsert를 적용하면 INSERT시에 Null 값인 필드를 제외시켜줍니다. 해당 기능은 어노테이션 추가만 하면 정상 작동이 됩니다.

 

(2) Java Enum

 

https://techblog.woowahan.com/2527/

 

Java Enum 활용기 | 우아한형제들 기술블로그

{{item.name}} 안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다. 이번 사내 블로그 포스팅 주제로 저는 Java Enum 활용 경험을 선택하였습니다. 이전에 개인 블로그에 E

techblog.woowahan.com

 

Java Enum은 위의 링크를 참조하시면 이해하기 쉬우실 것입니다. 필자는 덜 이해했지만 편한 것은 확실하다고 생각하여 이를 참고하여 이해하도록 계속 써보고 있습니다.

 

[RoleType]

public enum RoleType {
	ADMIN, USER
}

User
UserController

 

RoleType을 추가하면서 회원가입을 할 때에는 무조건 'USER'의 권한이 들어가도록 설정을 했습니다. 다만 데이터베이스에는 Enum이라는 자료형이 없어서 @Enumerated(EnumType.STRING)을 통해 String 자료형으로 들어가도록 설정이 가능합니다.

 

DBeaver

 

정상적으로 'USER'라는 권한이 들어가졌습니다.

 

(주의!)

만약 데이터를 계속 쌓고 싶은데 데이터베이스의 데이터들이 계속 초기화가 된다고 하시면 application.properties 파일을 열어봅시다.

 

application.properties

 

전에 ddl-auto=create로 설정을 했는데 이는 서버가 재시작을 하면 계속 데이터 베이스의 테이블을 DROP 후 CREATE를 시키도록 설정을 하고 있어서 데이터가 남아있지 않습니다.

 

위의 코드를 이와 같이 변경합니다.

 

application.properties

 

ddl-auto=update로 설정하면 DROP 후 CREATE 를 진행하지 않고 유지가 됩니다.

 

Postman

 

위와 같은 데이터를 추가하여 정상적으로 2개의 데이터가 있는지 확인하겠습니다.

 

DBeaver

 

정상적으로 데이터가 2개 있는 것을 확인하실 수 있습니다.