더미 데이터로 insert 연습
join
username, password, email만 사용자로부터 받으면 된다.
id, role, createDate는 자동으로 들어갈 것이다.
@RequestParam
@RequestParam("가져올 데이터의 이름") [데이터 타입] [가져온 데이터를 담을 변수]
@RequestParam을 생략하고 변수명을 일치하도록 적어도 동일하게 동작한다.
// 회원가입 성공 유무만 응답하면 되니까 @RestContoller
@RestController
public class DummyControllerTest {
// insert할 예정이므로 @PostMapping으로 해주고 주소를 설정한다.
// http://localhost:8000/blog/dummy/join (요청)
@PostMapping("/dummy/join")
public String join(@RequestParam("username") String u, String password, String email) {
System.out.println("usernmae: " + u);
System.out.println("password: " + password);
System.out.println("email: " + email);
return "회원가입이 완료되었습니다.";
}
}
join 함수는 매개변수에 변수명을 일치시켜서 적기만 하면 x-www-form-urlencoded로 전송되는 데이터의 key=value 값을 스프링이 함수의 매개변수로 파싱해서 변수에 집어 넣어준다. 이건 스프링이 제공해주는 약속된 규칙이다.
스프링은 이걸 넘어서서 오브젝트로 받아서 넘겨주는 강력한 역할까지 해준다.
// 회원가입 성공 유무만 응답하면 되니까 @RestContoller
@RestController
public class DummyControllerTest {
// insert할 예정이므로 @PostMapping으로 해주고 주소를 설정한다.
// http://localhost:8000/blog/dummy/join (요청)
@PostMapping("/dummy/join")
public String join(User user) {
System.out.println("id: " + user.getId());
System.out.println("usernmae: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
System.out.println("role: " + user.getRole());
System.out.println("createDate: " + user.getCreateDate());
return "회원가입이 완료되었습니다.";
}
}
DB에 Insert 해보기
package com.cos.blog.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.cos.blog.model.User;
// 해당 JpaRepository는 User 테이블이 관리한다. User 테이블의 PK는 Integer이다.
// @Repository 생략 가능
public interface UserRepository extends JpaRepository<User, Integer>{
}
JpaRepository 사용
- findAll() : User 테이블이 들고 있는 모든 행 정렬, 페이징해서 다 return
- save() : Insert, Update
- findById() : Id로 행 찾기
- deleteById() : Id로 행 삭제
- count() : User 테이블의 행 개수
- ...
기본적인 CRUD는 아무것도 정의하지 않고도 JpaRepository가 제공하는 기능으로 해결 가능하다.
또한 자동으로 빈 등록이 되기 때문에 @Repository를 생략해도 IOC에서 객체를 가지고 있어서 필요한 곳에서 인젝션을 통해 DI가 가능하다.
스프링이 @RestController를 읽고 DummyControllerTest를 메모리에 띄워줄 때 @Autowired를 통해 userRepository도 함꼐 메모리에 띄워진다.
@RestController
public class DummyControllerTest {
@Autowired
private UserRepository userRepository;
@PostMapping("/dummy/join")
public String join(User user) {
System.out.println("id: " + user.getId());
System.out.println("usernmae: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
System.out.println("role: " + user.getRole());
System.out.println("createDate: " + user.getCreateDate());
userRepository.save(user);
return "회원가입이 완료되었습니다.";
}
}
@Autowired
@Autowired는 UserRepository 타입으로 스프링이 관리하고 있는 객체가 있다면 변수 userRepository로 쏙 넣어줘서 의존성을 주입해준다.
UserRepository 타입은 메모리에 떠있을 것이다. 왜냐하면 스프링이 컴포넌트 스캔을 할 때 이미 UserRepository.java의 UserRepository를 메모리에 띄워주기 때문이다.
데이터를 넣어서 POST 요청을 해보면 role이 null로 들어가는 것을 볼 수 있다. Id는 자동으로 auto increment로 들어가고 createDate는 스프링에서 save될 때 @CreationTimestamp라는 어노테이션을 통해 시간을 자동 입력해준다.
쿼리를 살펴보면 다음과 같다.
보면은 insert 할 때 role값이 ?로 들어가고 있다. role은 @ColumnDefault의 값으로 "user"를 설정해놨었는데 "?" 값이 설정되니까 null이 되어버리는 것이다. 쿼리가 다음과 같이 돼야 role값이 설정이 안돼서 role에 디폴트 값인 "user" 값이 들어갈 것이다.
insert
into
User
(createDate, email, password, username)
values
(?, ?, ?, ?)
이렇게 쿼리에 role을 없애려면 @DynamicInsert 어노테이션을 사용해야 한다.
@DynamicInsert
@DynamicInsert는 null인 필드를 제외시키고 Insert해준다. 즉, User 클래스에 붙여주면 role 필드를 제외시켜줄 것이다.
@DynamicInsert
public class User {
다시 POST 해주면 다음처럼 쿼리가 바뀌고, role에 디폴트 값인 user가 들어간 것을 확인할 수 있다.
@DynamicInsert가 좋긴한데 이런식으로 계속 붙이다보면 어노테이션에만 의존하게 될 수 있으므로 여기선 주석 처리 후 진행한다. role의 디폴트 값을 설정해준 @ColumnDefault("'user'")도 주석처리 해준다.
그 후 join 함수에서 role을 "user"값으로 설정해준다. 그냥 타이핑하기엔 실수가 나올 수 있으므로 자바의 enum 기능을 사용한다.
package com.cos.blog.model;
public enum RoleType {
USER, ADMIN
}
user.setRole(RoleType.USER);
또한 User 모델에서 role을 String이 아닌 RoleTpye으로 타입을 제한시켜두면 실수를 줄일 수 있다. DB는 RoleType이 없으므로 @Enumerated(EnumType.STRING) 어노테이션으로 RoleType이 String임을 알려준다.
@Enumerated(EnumType.STRING)
private RoleType role;
잘 들어감!!
출처 : https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9
'Spring > Blog 만들기 with SpringBoot' 카테고리의 다른 글
update 테스트, JPA 영속성 컨텍스트 (0) | 2022.05.16 |
---|---|
selecte 및 paging 테스트 (0) | 2022.05.10 |
JSON (0) | 2022.05.10 |
연관관계의 주인 (0) | 2022.05.08 |
Blog 테이블 생성 - Board (0) | 2022.05.03 |