객체 지향 프로그래밍에서 객체의 데이터는 객체 외북에서 직접적으로 접근하는 것을 막는다. 객체 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수 있기 때문.
ex) 자동차 속도는 음수 불가, 하지만 외부에서 음수로 설정하면 객체 무결성이 깨짐.
따라서 메소드를 통해 테이터를 변경하는 방법 선호
Setter :데이터는 외부에서 접근하지않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도
(메소드는 매개값을 검증해서 유효한 값만 데이터로 저장 가능하기 때문)
외부에서 객체의 데이터를 읽을때도 메소드를 사용하는 것이 좋다.
Getter : 객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다. 이런 경우 메소드로 필드값을 가공 후 , 외부로 전달한다.
기본키를 자동으로 생성할 때에는 @Id
와 @GenerratedValue
어노테이션이 함께 사용되어야한다.
기본키 생성을 데이터베이스에게 위임하는 방식으로 id값을 할당하지 않아도 데이터 베이스가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성해준다.
@Entity
public class PkEx() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
사용자의 비밀번호는 보안을 위해 반드시 암호화하여 저장해야 한다.
암호화를 위해 시큐리티의 BCryptPasswordEncoder 클래스를 사용하여 암호화하여 비밀번호를 저장했다.
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
하지만 이렇게 BCryptPasswordEncoder 객체를 직접 new로 생성하는 방식보다는 PasswordEncoder 빈(bean)으로 등록해서 사용하는 것이 좋다. 왜냐하면 암호화 방식을 변경하면 BCryptPasswordEncoder를 사용한 모든 프로그램을 일일이 찾아서 수정해야 하기 때문이다.
PasswordEncoder 빈(bean)을 만드는 가장 쉬운 방법은 @Configuration
이 적용된 SecurityConfig.java에 @Bean
메서드를 생성하는 것이다.
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
이거 추가하면됨. 이후 UserService도 수정해야함.
사용자ID 또는 이메일 주소가 동일할 경우에는 DataIntegrityViolationException이 발생하므로 DataIntegrityViolationException 예외가 발생할 경우 "이미 등록된 사용자입니다."라는 오류를 화면에 표시하도록 했다. 그리고 다른 오류의 경우에는 해당 오류의 메시지(e.getMessage())를 출력하도록 했다.
bindingResult.reject(오류코드, 오류메시지)
는 특정 필드의 오류가 아닌 일반적인 오류를 등록할때 사용한다.
UserController.java
try {
userService.create(userCreateForm.getUsername(),
userCreateForm.getEmail(), userCreateForm.getPassword1());
}catch(DataIntegrityViolationException e) {
e.printStackTrace();
bindingResult.reject("signupFailed", "이미 등록된 사용자입니다.");
return "signup_form";
}catch(Exception e) {
e.printStackTrace();
bindingResult.reject("signupFailed", e.getMessage());
return "signup_form";
}