user 테이블을 만들고 SignInDto, controller 추가하여 로그인을 요청하는 기능을 구현하고 있습니다.
TblUser.java
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class TblUser implements UserDetails {
@Id
@Column(name="userid")
private Long userid ;
@Column(name="username",nullable = false,unique = true)
private String username;
@Column(name="password",nullable = false)
private String password;
@Column(name="email",nullable = false,unique = true)
private String email;
@Column(name="age")
private int age; //int 형
@Column(name = "phone_number")
private String phoneNumber;
@Enumerated(EnumType.STRING)
private Roles roles;
}
SignInDto.java
@Getter
@Setter
@ToString
@NoArgsConstructor
@SuperBuilder
public class SignInDto {
private String username;
private String password;
public SignInDto(String username,String password) {
this.username = username;
this.password = password;
}
}
임의로 값을 넣고
postman으로 로그인 요청을 해봅니다.
{
"username" : "testperson1",
"password" : "1q2w3e4r!"
}
에러
2024-08-05T14:38:08.089+09:00 ERROR 53416 --- [nio-8080-exec-1] c.e.m.service.UserService : 로그인 중 오류 발생 : SignInDto{username='testperson1', password='1q2w3e4r!'}
org.springframework.security.authentication.InternalAuthenticationServiceException: Null value was assigned to a property [class cohttp://m.example.moviarymoviediary.entity.TblUser.age] of primitive type: 'cohttp://m.example.moviarymoviediary.entity.TblUser.age' (setter)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:122) ~[spring-security-core-6.3.1.jar:6.3.1]
TblUser.age 값이 없어서 발생하는 오류입니다.
age 는 notnull 속성을 설정하지 않았는데 왜 오류가 발생하는걸까 ?
InternalAuthenticationServiceException 오류와 관련된 메시지를 보면, TblUser 엔티티의 age 속성에 null 값이 할당되었는데, 이 속성이 primitive 타입인 int로 선언되어 있어서 문제가 발생한 것 같습니다. Primitive 타입은 null 값을 가질 수 없기 때문에 이 오류가 발생합니다.
해결 방법
- Wrapper 클래스로 변경: int 대신 Integer와 같은 wrapper 클래스를 사용하면 null 값을 처리할 수 있습니다. Wrapper 클래스는 null 값을 허용하므로, 데이터베이스에서 값이 없는 경우에도 문제를 일으키지 않습니다.
int age -> Integer age 로 수정합니다.
응답에 성공했다.
2. 초기값 설정: 만약 int 타입을 그대로 사용하고 싶다면, 기본값을 설정해주는 방법이 있습니다.
private int age = 0; // 기본값 설정
이런식으로 초기값을 설정해 줄수 있습니다.
일반적으로 int 보단 Integer 로 설정하는 방법을 추천합니다.
초기값을 설정하는 방법은 단순하고 성능상 이점이 있지만, 값이 없음을 명확히 나타낼 수 없다는 단점이 있습니다.
'Integer' 를 사용하여 null 값을 처리할 수 있도록 하는 것이 좋습니다.
'백엔드 back-end' 카테고리의 다른 글
[리팩토링] if-statemets 를 효율적이고 가독성있게 사용하는 방법 3가지 (1) | 2024.08.20 |
---|---|
[Spring] @Value 어노테이션 값에 빨간줄 뜨는 이유? / 인식오류/ 해결방법 (0) | 2024.08.13 |
[Spring] @Controller & @RestController 차이/ 함께 사용가능? / 사용하는 이유? (0) | 2024.07.23 |
[JAVA] @JsonIgnoreProperties(ignoreUnknown=true) (0) | 2024.07.16 |
웹훅[Webhook] 이란 ? (0) | 2024.07.05 |