회원가입은 username, password, email 세 개의 데이터 값으로 가입이 가능하도록 

 

 

 

 

- 테스트하기 DummyControllerTest 클래스 생성

 

함수의 파라미터로 전송 받는법

** http://localhost:8000/dummy/join 

@RestController   //데이터 리턴 
public class DummyControllerTest {
   
   @PostMapping("/dummy/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 

x-www-form-unlencoded 의 마입타입은 html에서 form태그로 데이터를 전송할때 key=value 값으로 전송한다. 

두가지라면 key=value&key=value 

 

x-www-form-unlencoded로 전송되는 데이터는 key=value 형태로 전송되고

public String join(String username,String password, String email) 함수의 파라미터로 변수에 파싱해서 넣어줌.

 

 

 

 

 

객체로 받을경우

 

@RestController   //데이터 리턴 
public class DummyControllerTest {
    @PostMapping("/dummy/join")
    public String join(User user) { // key=value (약속된 규칙) 

        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("createDate : "+user.getCreateDate());

        return "회원가입이 완료되었습니다.";
    }
}

 

[User]

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder 
@Entity // User 클래스가 MySQL에 테이블이 생성이 된다.
// @DynamicInsert // insert시에 null인 필드를 제외시켜준다.
public class User {
	
	@Id //Primary key
	@GeneratedValue(strategy = GenerationType.IDENTITY) 
	private int id; // 시퀀스, auto_increment
	 
	@Column(nullable = false, length = 100, unique = true) 
	private String username; // 아이디
	
	@Column(nullable = false, length = 100) // 123456 => 해쉬 (비밀번호 암호화)
	private String password;
	
	@Column(nullable = false, length = 50)
	private String email;

	@ColumnDefault("user")
	private RoleType role;
	
	@CreationTimestamp
	private Timestamp createDate;
	
}

 

 

 

id는 int값 디플트값이고 password,role ,createDate는 값을 못받는다.

 

 

이제 회원가입 할때 DB에 insert하려면 

1. repository 패키지 만들기 (com.cos.blog.repository)

2. repository 안에 인터페이스 UserRepository 만들고 extends JpaRepository<User, Integer>

 

[UserRepository ]

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

JpaRepository<User, Integer> : JpaRepository 는 User 테이블을 관리하고 User의 pk는 Integer이다.

 

 

 

[ DummyControllerTest ]

 

@Autowired 어노테이션은DummyControllerTest 가 메모리에 뜰때 UserRepository도 같이 메모리에 뜨도록 한다.

= 이것이 의존성 주입.

추가하기
@Autowired  // 의존성 주입(DI)
private UserRepository userRepository;​
@RestController   //데이터 리턴 
public class DummyControllerTest {

	@Autowired  // 의존성 주입(DI)
	private UserRepository userRepository;

	@PostMapping("/dummy/join")
	public String join(User user) { // key=value (약속된 규칙) 

        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("createDate : "+user.getCreateDate());

        userRepository.save(user);
        return "회원가입이 완료되었습니다.";
    }
}

userRepository.save(user); DB에 저장

 

postman 에 send 후 DB에 들어간것을 확인할 수 있다.

* @CreationTimestamp 어노테이션은 자바가 현재시간을 넣어 insert해줬음.

 

 

 role값이 안들어간 이유는 디폴트 값 때문!

@ColumnDefault("'user'") 
private String role

 

디폴트값이 들어가려면 쿼리에 role이 없어야 디폴트값이 들어간다.

insert  into User  (createDate, email, password, username) 
    values (?, ?, ?, ?)

 

만약 쿼리에 role 을 넣었다면? 디폴트값이 적용이 안되고 null이 들어가버림..

insert  into User  (createDate, email, password, role, username) 
    values (?, ?, ?, ?, ?)

 

 

User 클래스에 @DynamicInsert 를 붙여주면 insert할때 null 인 필드 제외해준다.

 ▶ role 이 null이니까 role을 제외하고 디폴트값을 적용시켜 insert해준다.

 

 

 

 

 

 

User 클래스에 @DynamicInsert 붙여줘서 role 값에 디폴트값 적용됐음.

 

 

하지만 @DynamicInsert 어노테이션을 붙이면 붙일게 많아져서 딱히 좋은 방법은 아니다..

 

 

 

 

@DynamicInsert 대신 enum 사용하기 

Enum 만드는 방법

 

[RoleType] Enum 생성하기

public enum RoleType {
	USER, ADMIN
}

RoleType enum 클래스를 따로 만들어서 내가 넣는 값만 (USER, ADMIN) 쓸 수 있도록 강제할 수 있음.

users 를 쓰는 실수를 할일이 없다.

대체로 데이터 도메인을 만들 때 쓴다 (도메인은 범위) 어떤 범위 안에 데이터를 넣어서 

(남/녀) 를 (남자/여자) 로 쓰는 실수를 하지 않는 장점이 있다!

 

 

[User]

@Enumerated(EnumType.STRING)
private RoleType role;  //ADMIN, USER 두 개밖에 못넣도록

- EnumType.STRING : DB에는 RoleType 이라는게 없어서 해당 enum이 String이라고 알려줌

 

 

@RestController   //데이터 리턴 
public class DummyControllerTest {

	@Autowired  // 의존성 주입(DI)
	private UserRepository userRepository;

	@PostMapping("/dummy/join")
	public String join(User user) { // key=value (약속된 규칙) 

        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("createDate : "+user.getCreateDate());

	user.setRole(RoleType.USER);
        userRepository.save(user);
        return "회원가입이 완료되었습니다.";
    }
}

user.setRole(RoleType.USER); : RoleType Enum클래스에서 USER 을 DB에 저장

userRepository.save(user); DB에 저장

 

 

 

 

 

 

 

반응형
LIST

+ Recent posts