Skip to content

Commit 9bbfa8f

Browse files
authored
feat: 회원가입 시 프로필 이미지 업로드 및 S3 url 변수 분리 및 회원가입 로직 수정
feat: 회원가입 시 프로필 이미지 업로드 및 S3 url 변수 분리 및 회원가입 로직 수정
2 parents 49b7fbc + 2fc141e commit 9bbfa8f

File tree

10 files changed

+84
-39
lines changed

10 files changed

+84
-39
lines changed

src/main/java/swm/betterlife/antifragile/common/util/S3ImageComponent.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
import java.util.Objects;
1111
import java.util.UUID;
1212
import lombok.RequiredArgsConstructor;
13+
import lombok.extern.slf4j.Slf4j;
1314
import org.springframework.beans.factory.annotation.Value;
1415
import org.springframework.stereotype.Component;
1516
import org.springframework.web.multipart.MultipartFile;
1617
import swm.betterlife.antifragile.common.exception.S3DeleteFailException;
1718
import swm.betterlife.antifragile.common.exception.S3UploadFailException;
1819

20+
@Slf4j
1921
@Component
2022
@RequiredArgsConstructor
2123
public class S3ImageComponent {
@@ -45,7 +47,7 @@ public String uploadImage(S3ImageCategory category, MultipartFile multipartFile)
4547
throw new S3UploadFailException();
4648
}
4749

48-
return amazonS3.getUrl(bucket, fileName).toString();
50+
return fileName;
4951
}
5052

5153
private String createFileName(S3ImageCategory category, String originalFileName) {
@@ -57,12 +59,18 @@ private String createFileName(S3ImageCategory category, String originalFileName)
5759
return category + "/" + fileName + "_" + random + fileExtension;
5860
}
5961

60-
public void deleteImage(String imageUrl) {
61-
String[] deleteUrl = imageUrl.split("/", 4);
62+
public void deleteImage(String filename) {
6263
try {
63-
amazonS3.deleteObject(new DeleteObjectRequest(bucket, deleteUrl[3]));
64+
amazonS3.deleteObject(new DeleteObjectRequest(bucket, filename));
6465
} catch (AmazonS3Exception e) {
6566
throw new S3DeleteFailException();
6667
}
6768
}
69+
70+
public String getUrl(String filename) {
71+
if (filename != null) {
72+
return amazonS3.getUrl(bucket, filename).toString();
73+
}
74+
return null;
75+
}
6876
}

src/main/java/swm/betterlife/antifragile/domain/auth/controller/AuthController.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.springframework.web.bind.annotation.PostMapping;
88
import org.springframework.web.bind.annotation.RequestBody;
99
import org.springframework.web.bind.annotation.RequestMapping;
10+
import org.springframework.web.bind.annotation.RequestPart;
1011
import org.springframework.web.bind.annotation.RestController;
12+
import org.springframework.web.multipart.MultipartFile;
1113
import swm.betterlife.antifragile.common.response.ResponseBody;
1214
import swm.betterlife.antifragile.common.security.PrincipalDetails;
1315
import swm.betterlife.antifragile.domain.auth.dto.request.AuthLoginRequest;
@@ -34,9 +36,10 @@ public ResponseBody<AuthLoginResponse> login(
3436

3537
@PostMapping("/sign-up")
3638
public ResponseBody<AuthSignUpResponse> signUp(
37-
@RequestBody AuthSignUpRequest authSignUpRequest
39+
@RequestPart(required = false) MultipartFile profileImgFile,
40+
@RequestPart AuthSignUpRequest authSignUpRequest
3841
) {
39-
return ResponseBody.ok(authService.signUp(authSignUpRequest));
42+
return ResponseBody.ok(authService.signUp(authSignUpRequest, profileImgFile));
4043
}
4144

4245
@PostMapping("/logout")
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package swm.betterlife.antifragile.domain.auth.dto.request;
22

3+
import swm.betterlife.antifragile.domain.member.entity.Gender;
34
import swm.betterlife.antifragile.domain.member.entity.LoginType;
45

56
public record AuthSignUpRequest(
67
String email,
7-
LoginType loginType //todo: 암호화된 password로 받는 거 고민
8+
LoginType loginType,
9+
String nickname,
10+
Integer age,
11+
Gender gender,
12+
String job
813
) {
914

1015
}

src/main/java/swm/betterlife/antifragile/domain/auth/dto/response/AuthLoginResponse.java

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package swm.betterlife.antifragile.domain.auth.dto.response;
22

33
import lombok.Builder;
4-
import swm.betterlife.antifragile.domain.member.dto.response.MemberDetailResponse;
54
import swm.betterlife.antifragile.domain.member.entity.LoginType;
65
import swm.betterlife.antifragile.domain.member.entity.Member;
76
import swm.betterlife.antifragile.domain.token.dto.response.TokenIssueResponse;
@@ -12,7 +11,6 @@ public record AuthLoginResponse(
1211
String email,
1312
String nickname,
1413
LoginType loginType,
15-
MemberDetailResponse memberDetail,
1614
TokenIssueResponse tokenIssue
1715
) {
1816
public static AuthLoginResponse from(

src/main/java/swm/betterlife/antifragile/domain/auth/dto/response/AuthSignUpResponse.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,25 @@
33
import lombok.Builder;
44
import swm.betterlife.antifragile.domain.member.entity.LoginType;
55
import swm.betterlife.antifragile.domain.member.entity.Member;
6+
import swm.betterlife.antifragile.domain.token.dto.response.TokenIssueResponse;
67

78
@Builder
89
public record AuthSignUpResponse(
910
String id,
1011
String email,
1112
String nickname,
12-
LoginType loginType
13+
LoginType loginType,
14+
TokenIssueResponse tokenIssue
1315
) {
14-
public static AuthSignUpResponse from(Member member) {
16+
public static AuthSignUpResponse from(
17+
Member member, TokenIssueResponse tokenIssue
18+
) {
1519
return AuthSignUpResponse.builder()
1620
.id(member.getId())
1721
.email(member.getEmail())
1822
.nickname(member.getNickname())
1923
.loginType(member.getLoginType())
24+
.tokenIssue(tokenIssue)
2025
.build();
2126
}
2227
}

src/main/java/swm/betterlife/antifragile/domain/auth/service/AuthService.java

+38-16
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package swm.betterlife.antifragile.domain.auth.service;
22

3+
import static swm.betterlife.antifragile.common.util.S3ImageCategory.PROFILE;
34
import static swm.betterlife.antifragile.domain.member.entity.RoleType.ROLE_USER;
45

56
import com.mongodb.client.result.UpdateResult;
67
import java.time.LocalDateTime;
8+
import java.util.Optional;
79
import lombok.RequiredArgsConstructor;
810
import lombok.extern.slf4j.Slf4j;
911
import org.springframework.beans.factory.annotation.Value;
@@ -17,8 +19,10 @@
1719
import org.springframework.security.crypto.password.PasswordEncoder;
1820
import org.springframework.stereotype.Service;
1921
import org.springframework.transaction.annotation.Transactional;
22+
import org.springframework.web.multipart.MultipartFile;
2023
import swm.betterlife.antifragile.common.exception.MemberNotFoundException;
2124
import swm.betterlife.antifragile.common.jwt.util.JwtProvider;
25+
import swm.betterlife.antifragile.common.util.S3ImageComponent;
2226
import swm.betterlife.antifragile.domain.auth.dto.request.AuthLoginRequest;
2327
import swm.betterlife.antifragile.domain.auth.dto.request.AuthLogoutRequest;
2428
import swm.betterlife.antifragile.domain.auth.dto.request.AuthSignUpRequest;
@@ -48,25 +52,26 @@ public class AuthService {
4852
private final PasswordEncoder passwordEncoder;
4953
private final TokenService tokenService;
5054
private final MongoTemplate mongoTemplate;
55+
private final S3ImageComponent s3ImageComponent;
5156

5257
@Transactional
5358
public AuthLoginResponse login(AuthLoginRequest authLoginRequest) {
54-
String username
55-
= authLoginRequest.loginType().name() + ":" + authLoginRequest.email(); //todo: common분리
5659
String password = authLoginRequest.password();
5760

58-
Authentication authentication = getAuthenticate(username, password);
61+
Authentication authentication
62+
= getAuthenticate(authLoginRequest.email(), password, authLoginRequest.loginType());
5963

6064
Member member = memberRepository.getMember(
6165
authLoginRequest.email(), authLoginRequest.loginType()
6266
);
63-
TokenIssueResponse tokenIssueResponse
64-
= jwtProvider.issueToken(authentication);
65-
return AuthLoginResponse.from(member, tokenIssueResponse);
67+
TokenIssueResponse tokenIssue = jwtProvider.issueToken(authentication);
68+
return AuthLoginResponse.from(member, tokenIssue);
6669
}
6770

6871
@Transactional
69-
public AuthSignUpResponse signUp(AuthSignUpRequest authSignUpRequest) {
72+
public AuthSignUpResponse signUp(
73+
AuthSignUpRequest authSignUpRequest, MultipartFile profileImgFile
74+
) {
7075
if (memberRepository.existsByEmailAndLoginType(
7176
authSignUpRequest.email(), authSignUpRequest.loginType())
7277
) {
@@ -77,14 +82,27 @@ public AuthSignUpResponse signUp(AuthSignUpRequest authSignUpRequest) {
7782
String encodedPassword = passwordEncoder.encode(password);
7883

7984
Member member = Member.builder()
80-
.email(authSignUpRequest.email())
81-
.password(encodedPassword)
82-
.loginType(authSignUpRequest.loginType())
83-
.roleType(ROLE_USER)
84-
.build();
85-
86-
return AuthSignUpResponse.from(memberRepository.save(member));
87-
85+
.email(authSignUpRequest.email())
86+
.password(encodedPassword)
87+
.loginType(authSignUpRequest.loginType())
88+
.age(authSignUpRequest.age())
89+
.gender(authSignUpRequest.gender())
90+
.job(authSignUpRequest.job())
91+
.profileImgFilename(
92+
Optional.ofNullable(profileImgFile)
93+
.map(file -> s3ImageComponent.uploadImage(PROFILE, file))
94+
.orElse(null)
95+
)
96+
.roleType(ROLE_USER)
97+
.build();
98+
99+
Member savedMember = memberRepository.save(member);
100+
101+
Authentication authentication =
102+
getAuthenticate(authSignUpRequest.email(), password, authSignUpRequest.loginType());
103+
TokenIssueResponse tokenIssue = jwtProvider.issueToken(authentication);
104+
105+
return AuthSignUpResponse.from(savedMember, tokenIssue);
88106
}
89107

90108
@Transactional
@@ -105,7 +123,11 @@ public void delete(String memberId) {
105123
}
106124
}
107125

108-
private Authentication getAuthenticate(String username, String password) {
126+
private Authentication getAuthenticate(
127+
String email, String password,
128+
LoginType loginType
129+
) {
130+
String username = loginType.name() + ":" + email;
109131
UsernamePasswordAuthenticationToken authenticationToken
110132
= new UsernamePasswordAuthenticationToken(username, password);
111133
return authenticationManagerBuilder.getObject().authenticate(authenticationToken);

src/main/java/swm/betterlife/antifragile/domain/contentreview/entity/ReviewMember.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ public class ReviewMember {
1515

1616
private String nickname;
1717

18-
private String profileImgUrl;
18+
private String profileImgFilename;
1919
}

src/main/java/swm/betterlife/antifragile/domain/member/dto/response/MemberDetailResponse.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ public record MemberDetailResponse(
1515
LoginType loginType //todo: 연속 작성일 수 추가
1616
) {
1717
public static MemberDetailResponse from(
18-
Member member, Integer point, Integer diaryTotalNum
18+
Member member, Integer point,
19+
Integer diaryTotalNum, String profileImgUrl
1920
) {
2021
return MemberDetailResponse.builder()
2122
.id(member.getId())
2223
.email(member.getEmail())
2324
.nickname(member.getNickname())
24-
.profileImgUrl(member.getProfileImgUrl())
25+
.profileImgUrl(profileImgUrl)
2526
.point(point)
2627
.diaryTotalNum(diaryTotalNum)
2728
.loginType(member.getLoginType())

src/main/java/swm/betterlife/antifragile/domain/member/entity/Member.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class Member extends BaseTimeEntity {
3535

3636
private String job;
3737

38-
private String profileImgUrl;
38+
private String profileImgFilename;
3939

4040
private List<String> emoticonThemeIds = new ArrayList<>();
4141

src/main/java/swm/betterlife/antifragile/domain/member/service/MemberService.java

+11-8
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ public class MemberService {
4141
public MemberDetailResponse findMemberByEmail(String id) {
4242
Integer point = memberPointService.getPointByMemberId(id);
4343
Integer diaryTotalNum = memberDiaryService.getDiaryTotalNumByMemberId(id);
44-
return MemberDetailResponse
45-
.from(memberRepository.getMember(id), point, diaryTotalNum);
44+
Member member = memberRepository.getMember(id);
45+
return MemberDetailResponse.from(
46+
member, point, diaryTotalNum,
47+
s3ImageComponent.getUrl(member.getProfileImgFilename())
48+
);
4649
}
4750

4851
public Member getMemberById(String id) {
@@ -79,21 +82,21 @@ public MemberProfileModifyResponse modifyProfile(
7982

8083
private String modifyProfileImg(MultipartFile profileImgFile, String id) {
8184
Member member = memberRepository.getMember(id);
82-
String originProfileImgUrl = member.getProfileImgUrl();
83-
if (originProfileImgUrl != null) {
84-
s3ImageComponent.deleteImage(originProfileImgUrl);
85+
String originFilename = member.getProfileImgFilename();
86+
if (originFilename != null) {
87+
s3ImageComponent.deleteImage(originFilename);
8588
}
8689

87-
String newProfileImgUrl = s3ImageComponent.uploadImage(PROFILE, profileImgFile);
90+
String newFilename = s3ImageComponent.uploadImage(PROFILE, profileImgFile);
8891
Query query = new Query(Criteria.where("id").is(id));
89-
Update update = new Update().set("profileImgUrl", newProfileImgUrl);
92+
Update update = new Update().set("profileImgFilename", newFilename);
9093

9194
UpdateResult result = mongoTemplate.upsert(query, update, Member.class);
9295

9396
if (result.getMatchedCount() == 0) {
9497
throw new MemberNotFoundException();
9598
}
96-
return newProfileImgUrl;
99+
return s3ImageComponent.getUrl(newFilename);
97100
}
98101

99102
@Transactional(readOnly = true)

0 commit comments

Comments
 (0)