Skip to content

Commit 06ac683

Browse files
committed
RINGUS-30 fix: 충돌 오류 및 연관관계 수정
2 parents caa5574 + 9b58060 commit 06ac683

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+806
-389
lines changed

dev.sh

100644100755
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22

3-
ENV_FILE=".env"
3+
ENV_FILE=".env.dev"
44

55
echo "[dev.sh] environment variable file: $ENV_FILE"
66

@@ -25,7 +25,7 @@ fi
2525

2626
echo "[dev.sh] environment variable load complete"
2727

28-
./gradlew clean build
28+
./gradlew build -x test
2929

3030
if [ $? -eq 0 ]; then
3131
echo "[dev.sh] build complete"
@@ -34,6 +34,6 @@ else
3434
exit 1
3535
fi
3636

37-
sudo docker compose --env-file .env up -d --build
37+
sudo docker compose --env-file .env.dev up -d --build
3838

39-
echo "[dev.sh] deploy complete"
39+
echo "[dev.sh] deploy complete"

docker-compose.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ services:
1414
restart: always
1515

1616
database:
17-
image: mysql:9.0.0
17+
image: mysql:8.4.4
1818
container_name: ring-us-database
1919
environment:
2020
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
@@ -34,16 +34,14 @@ services:
3434
redis:
3535
image: redis:7.0
3636
container_name: ring-us-redis
37-
environment:
38-
REDIS_PASSWORD : ${REDIS_PASSWORD}
39-
command: redis-server --requirepass ${REDIS_PASSWORD}
37+
command: --port ${REDIS_PORT} --requirepass ${REDIS_PASSWORD}
4038
expose:
4139
- ${REDIS_PORT}
4240
ports:
4341
- ${REDIS_PORT}:${REDIS_PORT}
4442
restart: always
4543
volumes:
46-
- ring-us-redis:/var/lib/redis
44+
- ring-us-redis:/data
4745
volumes:
4846
ring-us-database:
49-
ring-us-redis:
47+
ring-us-redis:

src/main/java/es/princip/ringus/application/auth/service/AuthService.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package es.princip.ringus.application.auth.service;
22

3+
4+
import es.princip.ringus.application.member.service.MemberService;
35
import es.princip.ringus.application.serviceTerm.ServiceTermAgreementService;
4-
import es.princip.ringus.domain.serviceTerm.ServiceTermAgreement;
6+
import es.princip.ringus.domain.email.EmailSessionRepository;
7+
import es.princip.ringus.domain.member.Member;
58
import es.princip.ringus.presentation.auth.dto.request.LoginRequest;
6-
import es.princip.ringus.presentation.auth.dto.response.LoginResponse;
79
import es.princip.ringus.presentation.auth.dto.request.SignUpRequest;
10+
import es.princip.ringus.presentation.auth.dto.response.LoginResponse;
811
import es.princip.ringus.presentation.auth.dto.response.SignUpResponse;
9-
import es.princip.ringus.application.member.service.MemberService;
10-
import es.princip.ringus.domain.member.Member;
1112
import jakarta.servlet.http.HttpSession;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.stereotype.Service;
@@ -24,14 +25,17 @@ public class AuthService {
2425
private final EmailVerificationService verificationService;
2526
private final MemberService memberService;
2627
private final ServiceTermAgreementService serviceTermAgreementService;
28+
private final EmailSessionRepository emailSessionRepository;
2729

2830
@Transactional
29-
public SignUpResponse signUp(SignUpRequest request){
30-
verificationService.verifySession(request.email());
31+
public SignUpResponse signUp(SignUpRequest request, HttpSession session){
32+
String sessionId = session.getId();
33+
34+
verificationService.verifySession(request.email(), session);
3135

32-
Set<ServiceTermAgreement> serviceTerm = serviceTermAgreementService.validateAndCreateAgreements(request.serviceTerms());
36+
Member member = memberService.createMember(request, serviceTermAgreementService.validateAndCreateAgreements(request.serviceTerms()));
3337

34-
Member member = memberService.createMember(request, serviceTerm);
38+
emailSessionRepository.deleteById(sessionId);
3539

3640
return new SignUpResponse(member.getId());
3741
}

src/main/java/es/princip/ringus/application/auth/service/EmailVerificationService.java

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,21 @@
22

33
import es.princip.ringus.domain.email.EmailSession;
44
import es.princip.ringus.domain.email.EmailSessionRepository;
5-
import es.princip.ringus.domain.email.EmailVerificationRepository;
65
import es.princip.ringus.domain.email.EmailVerification;
6+
import es.princip.ringus.domain.email.EmailVerificationRepository;
77
import es.princip.ringus.domain.exception.EmailErrorCode;
88
import es.princip.ringus.domain.exception.SignUpErrorCode;
99
import es.princip.ringus.domain.member.MemberRepository;
1010
import es.princip.ringus.global.exception.CustomRuntimeException;
11+
import jakarta.annotation.PostConstruct;
12+
import jakarta.servlet.http.HttpSession;
1113
import jakarta.transaction.Transactional;
1214
import lombok.RequiredArgsConstructor;
15+
import org.springframework.beans.factory.annotation.Value;
1316
import org.springframework.stereotype.Service;
1417

18+
import java.util.Objects;
19+
1520
@Service
1621
@RequiredArgsConstructor
1722
public class EmailVerificationService {
@@ -21,6 +26,14 @@ public class EmailVerificationService {
2126
private final MemberRepository memberRepository;
2227
private final EmailSendService emailSendService;
2328

29+
@Value("${verification.max-failed-attempts}")
30+
private int maxFailedAttempts;
31+
32+
@PostConstruct
33+
public void init(){
34+
EmailVerification.setMaxFailedAttempts(maxFailedAttempts);
35+
}
36+
2437
@Transactional
2538
public void generateVerificationCode(String email) {
2639
if(memberRepository.existsByEmail(email)){
@@ -42,7 +55,7 @@ public void generateVerificationCode(String email) {
4255
* @throws CustomRuntimeException
4356
*/
4457
@Transactional
45-
public void verifyCode(String email, String inputCode){
58+
public void verifyCode(String email, String inputCode, HttpSession session){
4659
EmailVerification verification = verificationRepository.findById(email)
4760
.orElseThrow(() -> new CustomRuntimeException(EmailErrorCode.TTL_EXPIRED));
4861

@@ -57,7 +70,11 @@ public void verifyCode(String email, String inputCode){
5770
}
5871

5972
verificationRepository.delete(verification);
60-
sessionRepository.save(EmailSession.of(email));
73+
74+
String sessionId = session.getId();
75+
76+
sessionRepository.save(EmailSession.of(email, sessionId));
77+
6178
}
6279

6380
/**
@@ -66,8 +83,14 @@ public void verifyCode(String email, String inputCode){
6683
* @throws CustomRuntimeException
6784
*/
6885
@Transactional
69-
public void verifySession(String email){
70-
EmailSession emailSession = sessionRepository.findByEmail(email)
86+
public void verifySession(String email, HttpSession session){
87+
EmailSession emailSession = sessionRepository.findById(email)
7188
.orElseThrow(() -> new CustomRuntimeException(EmailErrorCode.TTL_EXPIRED));
89+
90+
if(!Objects.equals(emailSession.getSessionId(), session.getId())){
91+
throw new CustomRuntimeException(EmailErrorCode.SESSION_EMAIL_MISMATCH);
92+
}
93+
94+
sessionRepository.delete(emailSession);
7295
}
7396
}

src/main/java/es/princip/ringus/application/member/service/MemberService.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package es.princip.ringus.application.member.service;
22

3-
import es.princip.ringus.domain.serviceTerm.ServiceTermAgreement;
4-
import es.princip.ringus.presentation.auth.dto.request.SignUpRequest;
3+
import es.princip.ringus.domain.exception.MemberErrorCode;
54
import es.princip.ringus.domain.exception.SignUpErrorCode;
65
import es.princip.ringus.domain.member.Member;
76
import es.princip.ringus.domain.member.MemberRepository;
7+
import es.princip.ringus.domain.serviceTerm.ServiceTermAgreement;
88
import es.princip.ringus.global.exception.CustomRuntimeException;
9+
import es.princip.ringus.global.util.UniversityDomainUtil;
10+
import es.princip.ringus.presentation.auth.dto.request.SignUpRequest;
11+
import es.princip.ringus.presentation.member.dto.MemberResponse;
912
import lombok.RequiredArgsConstructor;
1013
import org.springframework.security.crypto.password.PasswordEncoder;
1114
import org.springframework.stereotype.Service;
@@ -31,14 +34,19 @@ public Member createMember(SignUpRequest request, Set<ServiceTermAgreement> serv
3134
throw new CustomRuntimeException(SignUpErrorCode.DUPLICATE_EMAIL);
3235
}
3336

34-
Member member = Member.of(request.email(), request.password(), passwordEncoder, request.memberType(), serviceTerm);
37+
boolean isUniversityVerified = UniversityDomainUtil.isUniversityVerified(request.email());
38+
39+
Member member = Member.of(request.email(), request.password(), passwordEncoder, request.memberType(), serviceTerm, isUniversityVerified);
40+
3541
memberRepository.save(member);
3642

3743
return member;
3844
}
3945

40-
public Member getByMemberId(Long memberId) {
41-
return memberRepository.findById(memberId).orElseThrow();
42-
}
46+
public MemberResponse getMemberById(Long memberId){
47+
Member member = memberRepository.findById(memberId)
48+
.orElseThrow(() -> new CustomRuntimeException(MemberErrorCode.MEMBER_NOT_FOUND));
4349

50+
return MemberResponse.from(member);
51+
}
4452
}

src/main/java/es/princip/ringus/application/mentee/service/MenteeService.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import es.princip.ringus.domain.mentee.MenteeRepository;
88
import es.princip.ringus.domain.mentor.MentorRepository;
99
import es.princip.ringus.global.exception.CustomRuntimeException;
10-
import es.princip.ringus.presentation.user.dto.MenteeRequest;
10+
import es.princip.ringus.presentation.mentee.dto.MenteeRequest;
1111
import lombok.RequiredArgsConstructor;
1212
import org.springframework.stereotype.Service;
1313
import org.springframework.transaction.annotation.Transactional;
@@ -18,24 +18,13 @@
1818
public class MenteeService {
1919

2020
private final MemberRepository memberRepository;
21-
private final MentorRepository mentorRepository;
2221
private final MenteeRepository menteeRepository;
2322

2423
@Transactional
25-
public void createMentee(MenteeRequest request) {
24+
public Long register(MenteeRequest request) {
2625
Member member = memberRepository.findByEmail(request.email())
2726
.orElseThrow(() -> new CustomRuntimeException(SignUpErrorCode.WRONG_EMAIL));
28-
29-
if (mentorRepository.existsByMember(member)) {
30-
throw new CustomRuntimeException(SignUpErrorCode.ALREADY_REGISTERED_AS_MENTOR);
31-
}
32-
if (menteeRepository.existsByMember(member)) {
33-
throw new CustomRuntimeException(SignUpErrorCode.ALREADY_REGISTERED_AS_MENTEE);
34-
}
35-
36-
Mentee mentee = Mentee.of(member, request.nickname(), request.introduction(), request.major(), request.educationLevelType());
37-
38-
menteeRepository.save(mentee);
27+
Mentee mentee = request.toEntity();
28+
return menteeRepository.save(mentee).getId();
3929
}
40-
41-
}
30+
}

src/main/java/es/princip/ringus/application/mentor/service/MentorService.java

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import es.princip.ringus.domain.mentor.Mentor;
88
import es.princip.ringus.domain.mentor.MentorRepository;
99
import es.princip.ringus.global.exception.CustomRuntimeException;
10-
import es.princip.ringus.presentation.user.dto.MentorRequest;
10+
import es.princip.ringus.presentation.mentor.dto.MentorRequest;
1111
import lombok.RequiredArgsConstructor;
1212
import org.springframework.stereotype.Service;
1313
import org.springframework.transaction.annotation.Transactional;
@@ -19,23 +19,12 @@ public class MentorService {
1919

2020
private final MemberRepository memberRepository;
2121
private final MentorRepository mentorRepository;
22-
private final MenteeRepository menteeRepository;
2322

2423
@Transactional
25-
public void createMentor(MentorRequest request) {
24+
public Long register(MentorRequest request) {
2625
Member member = memberRepository.findByEmail(request.email())
2726
.orElseThrow(() -> new CustomRuntimeException(SignUpErrorCode.WRONG_EMAIL));
28-
29-
if (mentorRepository.existsByMember(member)) {
30-
throw new CustomRuntimeException(SignUpErrorCode.ALREADY_REGISTERED_AS_MENTOR);
31-
}
32-
if (menteeRepository.existsByMember(member)) {
33-
throw new CustomRuntimeException(SignUpErrorCode.ALREADY_REGISTERED_AS_MENTEE);
34-
}
35-
36-
Mentor mentor = Mentor.of(member, request.nickname(), request.introduction(), request.company(), request.job(), request.experience());
37-
38-
mentorRepository.save(mentor);
27+
Mentor mentor = request.toEntity(member.getId());
28+
return mentorRepository.save(mentor).getId();
3929
}
40-
41-
}
30+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package es.princip.ringus.domain.common;
2+
3+
import jakarta.persistence.Embeddable;
4+
import lombok.AccessLevel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
8+
9+
// 학력
10+
@Getter
11+
@Embeddable
12+
@AllArgsConstructor
13+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
14+
public class Education {
15+
// 학교명 (필수)
16+
private String schoolName;
17+
// 전공명 (선택)
18+
private String major;
19+
}

src/main/java/es/princip/ringus/domain/email/EmailSession.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ public class EmailSession implements Serializable {
1515

1616
@Id
1717
private String email;
18+
private String sessionId;
1819

19-
public static EmailSession of(String email) {
20-
return new EmailSession(email);
20+
public static EmailSession of(String email, String sessionId) {
21+
return new EmailSession(email, sessionId);
2122
}
2223

23-
private EmailSession(String email) {
24+
private EmailSession(String email, String sessionId) {
2425
this.email = email;
26+
this.sessionId = sessionId;
2527
}
2628
}

src/main/java/es/princip/ringus/domain/email/EmailVerification.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.NoArgsConstructor;
66
import org.springframework.data.annotation.Id;
77
import org.springframework.data.redis.core.RedisHash;
8+
89
import java.io.Serializable;
910
import java.util.Random;
1011

@@ -26,6 +27,8 @@ public class EmailVerification implements Serializable {
2627

2728
private int failedAttempts;
2829

30+
private static int maxFailedAttempts;
31+
2932
public static EmailVerification of(String email) {
3033
return new EmailVerification(email, generateVerificationCode());
3134
}
@@ -45,10 +48,14 @@ public void plusFailedAttempts() {
4548
}
4649

4750
public boolean hasVerificationAttemptsLeft() {
48-
return failedAttempts < 5;
51+
return failedAttempts < maxFailedAttempts;
4952
}
5053

5154
public boolean isValid(String inputCode) {
5255
return this.verificationCode.equals(inputCode);
5356
}
57+
58+
public static void setMaxFailedAttempts(int maxFailedAttempts) {
59+
EmailVerification.maxFailedAttempts = maxFailedAttempts;
60+
}
5461
}

0 commit comments

Comments
 (0)