Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 7 additions & 12 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,17 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'

// 인증사 관련 의존성
implementation 'javax.servlet:jstl:1.2'
implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
Expand Down Expand Up @@ -69,7 +70,6 @@ dependencies {
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
testImplementation 'org.testcontainers:mysql:1.20.0'


// security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
Expand Down Expand Up @@ -103,11 +103,6 @@ dependencies {

runtimeOnly 'com.h2database:h2'

testImplementation 'org.springframework.boot:spring-boot-testcontainers:3.3.5'
testImplementation 'org.testcontainers:testcontainers:1.19.3'
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
testImplementation 'org.testcoscntainers:mysql:1.20.0'

annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

implementation 'org.apache.commons:commons-pool2:2.12.1'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package life.mosu.mosuserver.application.oauth;

import life.mosu.mosuserver.domain.user.entity.AuthProvider;
import life.mosu.mosuserver.domain.user.entity.UserJpaEntity;
import life.mosu.mosuserver.domain.user.entity.UserRole;
import life.mosu.mosuserver.domain.user.repository.UserJpaRepository;
import life.mosu.mosuserver.global.processor.StepProcessor;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@RequiredArgsConstructor
public class OAuthUserPersistenceProcessor implements StepProcessor<OAuthUserInfo, UserJpaEntity> {

private final UserJpaRepository userRepository;

@Override
@Transactional
public UserJpaEntity process(final OAuthUserInfo info) {
return userRepository.findByLoginId(info.email())
.map(existingUser -> {
existingUser.updateOAuthUser(
info.gender(),
info.name(),
info.phoneNumber(),
info.birthDay(),
info.marketingAgreed());
return existingUser;
})
.orElseGet(() -> {
final UserJpaEntity newUser = UserJpaEntity.builder()
.loginId(info.email())
.gender(info.gender())
.name(info.name())
.birth(info.birthDay())
.phoneNumber(info.phoneNumber())
.userRole(UserRole.ROLE_PENDING)
.provider(AuthProvider.KAKAO)
.agreedToTermsOfService(true)
.agreedToPrivacyPolicy(true)
.agreedToMarketing(info.marketingAgreed())
.build();
return userRepository.save(newUser);
});
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
package life.mosu.mosuserver.application.oauth;

import java.time.LocalDate;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import life.mosu.mosuserver.domain.profile.entity.Gender;
import life.mosu.mosuserver.domain.profile.repository.ProfileJpaRepository;
import life.mosu.mosuserver.domain.user.entity.AuthProvider;
import life.mosu.mosuserver.domain.user.entity.UserJpaEntity;
import life.mosu.mosuserver.domain.user.entity.UserRole;
import life.mosu.mosuserver.domain.user.repository.UserJpaRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference;
Expand All @@ -25,7 +20,7 @@
@RequiredArgsConstructor
public class OAuthUserService extends DefaultOAuth2UserService {

private final UserJpaRepository userRepository;
private final OAuthUserPersistenceProcessor oAuthUserPersistenceProcessor;
private final ProfileJpaRepository profileRepository;
private final WebClient webClient;

Expand All @@ -44,12 +39,15 @@ public OAuth2User loadUser(final OAuth2UserRequest userRequest)
agreedToMarketing = termsList.stream()
.filter(term -> term instanceof Map)
.map(term -> (Map<String, Object>) term)
.filter(termMap -> "terms_03".equals(termMap.get("tag")))
.filter(termMap ->
"terms_03".equals(termMap.get("tag")))
.findFirst()
.map(termMap -> (Boolean) termMap.get("agreed"))
.orElse(false);
}

log.info("동의 여부{}", agreedToMarketing);

final String registrationId = userRequest.getClientRegistration().getRegistrationId();
final String userNameAttributeName = userRequest.getClientRegistration()
.getProviderDetails()
Expand All @@ -59,43 +57,14 @@ public OAuth2User loadUser(final OAuth2UserRequest userRequest)
final OAuthUserInfo userInfo = OAuthUserInfo.of(OAuthProvider.from(registrationId),
oAuth2UserAttributes, agreedToMarketing);

final UserJpaEntity oAuthUser = updateOrWrite(userInfo);
final UserJpaEntity oAuthUser = oAuthUserPersistenceProcessor.process(userInfo);

Boolean isProfileRegistered = profileRepository.existsByUserId(oAuthUser.getId());

return new OAuthUser(oAuthUser, oAuth2UserAttributes, userNameAttributeName,
isProfileRegistered);
}

private UserJpaEntity updateOrWrite(final OAuthUserInfo info) {
return userRepository.findByLoginId(info.email())
.map(existingUser -> {
existingUser.updateOAuthUser(
info.gender(),
info.name(),
info.phoneNumber(),
info.birthDay() != null ? info.birthDay() : LocalDate.of(1900, 1, 1));
return existingUser;
})
.orElseGet(() -> {
final UserJpaEntity newUser = UserJpaEntity.builder()
.loginId(info.email() != null ? info.email() : "NA")
.gender(info.gender() != null ? info.gender() : Gender.PENDING)
.name(info.name() != null ? info.name() : "NA")
.birth(info.birthDay() != null ? info.birthDay()
: LocalDate.EPOCH)
.phoneNumber(info.phoneNumber() != null ? info.phoneNumber()
: "010-0000-0000")
.userRole(UserRole.ROLE_PENDING)
.provider(AuthProvider.KAKAO)
.agreedToTermsOfService(true)
.agreedToPrivacyPolicy(true)
.agreedToMarketing(info.marketingAgreed())
.build();
return userRepository.save(newUser);
});
}

private Map<String, Object> getServiceTerms(String accessToken) {

String url = "https://kapi.kakao.com/v2/user/service_terms";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,14 @@ public void updateOAuthUser(
Gender gender,
String name,
String phoneNumber,
LocalDate birth
LocalDate birth,
boolean agreedToMarketing
) {
this.gender = gender;
this.name = name;
this.phoneNumber = phoneNumber;
this.birth = birth;
this.agreedToMarketing = agreedToMarketing;
}

public void updateUserInfo(
Expand Down
Loading