Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] 회원가입 API #14

Merged
merged 8 commits into from
Oct 29, 2023
Merged

[feature] 회원가입 API #14

merged 8 commits into from
Oct 29, 2023

Conversation

JisooPyo
Copy link
Member

@JisooPyo JisooPyo commented Oct 27, 2023

관련 Issue

변경 사항

  • 회원가입 API 기능 구현 -> 포스트맨 체크 완료
    • 비밀번호 검증 로직 추가할 시 포스트맨 체크 사진 첨부 예정
  • Application단에서 테스트 편의를 위해 Security 기능을 off하였습니다. Security 구현 시 다시 이 옵션은 없애도록 하겠습니다.
  • 비밀번호 검증 로직을 추가하였습니다.

Check List

  • 포스트맨으로 체크해 보았나요?
비밀번호에 개인정보를 포함하는 경우 비밀번호가 9자 이하인 경우
image image
숫자, 문자, 특수문자 중 2가지 이상을 포함하지 않는 경우 3회 이상 연속되는 문자를 사용할 경우
image image
통상적으로 사용되는 비밀번호를 사용했을 경우
image
회원가입 완료 같은 메일 다른 계정 가입 가능
image image
같은 계정 가입 불가 이메일 구조 검증
image image

트러블 슈팅

1. 컬럼 기본값 설정 오류 문제



  • 오류 발생 상황

User Entity에서 isAccessed를 다음과 같이 설정했는데,

@Column(nullable = false)
private Boolean isAccessed = false;

UserService 에서 다음과 같이 User 객체를 @builder 로 생성한 다음, 저장하려고 했더니 오류가 발생하였다.

public void signup(SignupRequestDto requestDto) {
	String account = requestDto.getAccount(); 
	User = User.builder().account(account).build();
	userRepository.save(user);
}

발생한 오류

java.sql.SQLIntegrityConstraintViolationException: Column 'is_accessed' cannot be null


  • 오류 원인

찾아보니 내가 설정해 준 기본 값 false는 Java 객체 레벨에서 설정을 해 준 것이지, 데이터베이스 레벨에서의 초기화가 아니라고 한다.

User 테이블이 만들어지는 SQL문을 살펴보면 다음과 같이 기본값이 잡혀 있지 않음을 알 수 있다. Column에 기본값이 잡힌다면 is_accessed bit default false not null이 되어야 한다.

create table user (
    is_accessed bit not null,
	...
)


  • 해결 방법
  1. 생성자를 통해 객체를 만들 때

@ColumnDefault 를 사용하여 디폴트 값을 정해준 뒤, 나머지 필드를 생성자로 만들어서 객체를 생성한 뒤 DB에 저장한다.

@Column(nullable = false)
@ColumnDefault("false")		// JPA Annotation
private Boolean isAccessed;

User user = new User(email, password, account);
  1. @Builder를 통해 객체를 만들 때

@Builder.Default 를 사용하여 isAccessed 필드를 @Builder의 Default 값으로 설정해준다.

@Column(nullable = false)
@Builder.Default
private Boolean isAccessed = false;

User user = User.builder()
	.email(email).password(password)
	.account(account).build();

참고링크


2. NullPointerException

  • 발생한 오류
java.lang.NullPointerException:
Cannot invoke "PasswordValidation.validatePassword(SignupRequestDto)"
because "this.passwordValidation" is null
  • 내 코드
public class UserService {

	private final UserRepository userRepository;
	private final PasswordEncoder passwordEncoder;
	PasswordValidation passwordValidation;

	public void signup(SignupRequestDto requestDto) {
		...
		// 비밀번호 검증이 완료되면 password encoding
		passwordValidation.validatePassword(requestDto);
		...
	}
}
  • 원인

객체를 초기화해주지 않고 선언만 해서 PasswordValidation 객체가 null값이 되어서 해당 객체의 메서드를 불러오지 못한 것이 문제였다.

  • 해결

PasswordValidation을 Bean으로 등록한다.(의존성 주입)

@JisooPyo JisooPyo added feature New feature or request WIP Work In Progress labels Oct 27, 2023
@JisooPyo JisooPyo self-assigned this Oct 27, 2023
@github-actions
Copy link

github-actions bot commented Oct 27, 2023

Test Results

1 tests  ±0   1 ✔️ ±0   0s ⏱️ ±0s
1 suites ±0   0 💤 ±0 
1 files   ±0   0 ±0 

Results for commit bd6f591. ± Comparison against base commit 7ea67d3.

♻️ This comment has been updated with latest results.

@rivkode rivkode self-requested a review October 27, 2023 09:03
객체 선언만 해주어서 nullPointerException 발생, Bean으로 등록하여 관리
@JisooPyo JisooPyo changed the title [feature] 회원가입 API (WIP) [feature] 회원가입 API Oct 28, 2023
@JisooPyo JisooPyo removed the WIP Work In Progress label Oct 28, 2023
Copy link
Contributor

@9898s 9898s left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JisooPyo님! 리뷰 남겼습니다.
많이 배워갑니다. 수고 많으셨어요!

Copy link
Member

@rivkode rivkode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

패턴매칭, 유사 비밀번호 체크

Comment on lines +49 to +62
private boolean containPrivateInformation(String account, String email, String password) {
int atIndex = email.indexOf("@");
String id = email.substring(0, atIndex);

return password.contains(account) || password.contains(id);
}

private boolean followRules(String password) {
boolean numberEnglish = Pattern.matches("^(?=.*[0-9]+)(?=.*[a-zA-Z]+).+", password);
boolean englishSpecialSymbol = Pattern.matches("^(?=.*[a-zA-Z]+)(?=.*[!@#$%^&*]+).+", password);
boolean specialSymbolsNumber = Pattern.matches("^(?=.*[!@#$%^&*]+)(?=.*[0-9]+).+", password);

return numberEnglish || englishSpecialSymbol || specialSymbolsNumber;
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

패턴매칭과 유사한 비밀번호 설정 체크를 이렇게 할 수 있군요 !

많이 배워갑니다 ㅎㅎ

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

정규식은 언제 해도 너무 귀찮네요 흑흑

Copy link
Member

@rivkode rivkode left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 승인

@rivkode rivkode merged commit 67b5df8 into develop Oct 29, 2023
3 checks passed
@rivkode rivkode deleted the feature/5/signup branch October 29, 2023 06:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants