Skip to content

Commit 270d93c

Browse files
committed
fix(editUserProfile): 회원정보 수정 로직 리팩토링
2 parents d5fccbc + c220d4b commit 270d93c

16 files changed

Lines changed: 296 additions & 211 deletions

.github/workflows/cd.yml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ jobs:
3232
distribution: 'temurin'
3333

3434
- name: Grant execute permission for gradlew
35-
run: chmod +x ./gradlew
35+
run: |
36+
chmod +x ./gradlew
37+
chmod +x ./scripts/deploy.sh
3638
3739
- name: Build with Gradle
3840
run: ./gradlew clean build -x test
@@ -51,16 +53,23 @@ jobs:
5153
echo "mysql_password=${{ secrets.mysql_password }}" >> .env
5254
echo "jwt_key=${{ secrets.jwt_key }}" >> .env
5355
54-
- name: Zip deploy package
56+
- name: Prepare deployment package
5557
run: |
56-
zip -r ../${{ github.sha }}.zip . -x ".git/*"
58+
mkdir -p deploy
59+
cp ./build/libs/*.jar ./deploy/
60+
cp -r ./scripts ./deploy/
61+
cp .env ./deploy/
62+
cp appspec.yml ./deploy/
63+
chmod +x ./deploy/scripts/deploy.sh
64+
cd deploy
65+
zip -r ../${{ github.sha }}.zip .
5766
5867
- name: Upload to S3
5968
run: |
6069
aws deploy push \
6170
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
6271
--s3-location s3://${{ env.S3_BUCKET_NAME }}/${{ github.sha }}.zip \
63-
--source . \
72+
--source ./deploy \
6473
--region ${{ env.AWS_REGION }}
6574
6675
- name: Deploy with CodeDeploy

appspec.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ permissions:
1515

1616
hooks:
1717
AfterInstall:
18-
- location: FixLog_Server/scripts/deploy.sh
18+
- location: scripts/deploy.sh
1919
timeout: 180
2020
runas: ec2-user

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ dependencies {
2727
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2828
implementation 'org.springframework.boot:spring-boot-starter-security'
2929
implementation 'org.springframework.boot:spring-boot-starter-web'
30+
implementation 'org.springframework.boot:spring-boot-starter-validation'
3031
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
3132
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
3233
runtimeOnly('io.jsonwebtoken:jjwt-jackson:0.11.5')

scripts/deploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
export $(grep -v '^#' /home/ec2-user/app/.env | xargs)
44

5-
BUILD_JAR=$(ls /home/ec2-user/app/build/libs/*.jar)
5+
BUILD_JAR=$(ls /home/ec2-user/app/*.jar)
66
JAR_NAME=$(basename $BUILD_JAR)
77
echo "> build 파일명: $JAR_NAME" >> /home/ec2-user/app/deploy.log
88

src/main/java/com/example/FixLog/config/SecurityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
3232
.requestMatchers(HttpMethod.GET, "/members/check-email").permitAll()
3333
.requestMatchers(HttpMethod.GET, "/members/check-nickname").permitAll()
3434
.requestMatchers(HttpMethod.GET, "/h2-console/**").permitAll()
35+
//배포 확인용 임시 수정
36+
.requestMatchers(HttpMethod.GET, "/test", "/test/**").permitAll()
3537
.anyRequest().authenticated()
3638
)
3739
.headers(headers -> headers.frameOptions(frame -> frame.disable())) // H2 콘솔용
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.example.FixLog.controller;
2+
3+
@RestController
4+
public class Controller {
5+
6+
@GetMapping("test/api")
7+
public String test() {
8+
return "this is test.";
9+
}
10+
11+
}

src/main/java/com/example/FixLog/controller/MypageMemberController.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
import com.example.FixLog.domain.member.Member;
1010
import lombok.RequiredArgsConstructor;
1111
import org.springframework.http.ResponseEntity;
12-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
13-
import org.springframework.security.core.userdetails.UserDetails;
12+
import jakarta.validation.Valid;
1413
import org.springframework.web.bind.annotation.PatchMapping;
1514
import org.springframework.web.bind.annotation.RequestBody;
1615
import org.springframework.web.bind.annotation.RequestMapping;
@@ -25,38 +24,37 @@ public class MypageMemberController {
2524

2625
@PatchMapping("/members/nickname")
2726
public ResponseEntity<Response<String>> editNickname(
28-
@RequestBody EditNicknameRequestDto requestDto
27+
@RequestBody @Valid EditNicknameRequestDto requestDto
2928
) {
3029
Member member = memberService.getCurrentMemberInfo();
3130
memberService.editNickname(member, requestDto.getNickname());
32-
return ResponseEntity.ok(Response.success("닉네임 수정 성공", null));
31+
return ResponseEntity.ok(Response.success("닉네임 수정 성공", "SUCCESS"));
3332
}
3433

3534
@PatchMapping("/members/password")
36-
public ResponseEntity<Response<Void>> editPassword(
37-
@AuthenticationPrincipal UserDetails userDetails,
38-
@RequestBody EditPasswordRequestDto requestDto
35+
public ResponseEntity<Response<String>> editPassword(
36+
@RequestBody @Valid EditPasswordRequestDto requestDto
3937
) {
4038
Member member = memberService.getCurrentMemberInfo();
4139
memberService.editPassword(member, requestDto);
42-
return ResponseEntity.ok(Response.success("비밀번호 변경 성공", null));
40+
return ResponseEntity.ok(Response.success("비밀번호 변경 성공", "SUCCESS"));
4341
}
4442

4543
@PatchMapping("/members/profile-image")
4644
public ResponseEntity<Response<String>> editProfileImage(
47-
@RequestBody EditProfileImageRequestDto requestDto
45+
@RequestBody @Valid EditProfileImageRequestDto requestDto
4846
) {
4947
Member member = memberService.getCurrentMemberInfo();
5048
memberService.editProfileImage(member, requestDto.getProfileImageUrl());
51-
return ResponseEntity.ok(Response.success("프로필 이미지 수정 성공", null));
49+
return ResponseEntity.ok(Response.success("프로필 이미지 수정 성공", "SUCCESS"));
5250
}
5351

5452
@PatchMapping("/members/bio")
5553
public ResponseEntity<Response<String>> editBio(
56-
@RequestBody EditBioRequestDto requestDto
54+
@RequestBody @Valid EditBioRequestDto requestDto
5755
) {
5856
Member member = memberService.getCurrentMemberInfo();
5957
memberService.editBio(member, requestDto.getBio());
60-
return ResponseEntity.ok(Response.success("소개글 수정 성공", null));
58+
return ResponseEntity.ok(Response.success("소개글 수정 성공", "SUCCESS"));
6159
}
62-
}
60+
}

src/main/java/com/example/FixLog/domain/member/Member.java

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import lombok.AccessLevel;
77
import lombok.Getter;
88
import lombok.NoArgsConstructor;
9-
import lombok.Setter;
109
import org.springframework.data.annotation.CreatedDate;
1110
import org.springframework.data.annotation.LastModifiedDate;
1211
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@@ -21,7 +20,6 @@
2120

2221
@Entity
2322
@Getter
24-
@Setter
2523
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2624
@EntityListeners(AuditingEntityListener.class)
2725
public class Member implements UserDetails {
@@ -43,10 +41,6 @@ public class Member implements UserDetails {
4341
@Column(nullable = false)
4442
private Boolean isDeleted = false;
4543

46-
public void setIsDeleted(boolean isDeleted) {
47-
this.isDeleted = isDeleted;
48-
}
49-
5044
@Enumerated(EnumType.STRING)
5145
@Column(nullable = false)
5246
private SocialType socialType = SocialType.EMAIL;
@@ -59,37 +53,56 @@ public void setIsDeleted(boolean isDeleted) {
5953
@Column
6054
private LocalDateTime updatedAt;
6155

62-
// 프로필 사진 url
56+
// 프로필 사진 URL
6357
@Column
6458
private String profileImageUrl;
6559

6660
@Column(length = 200)
6761
private String bio;
6862

63+
// 게시글 연관관계
6964
@OneToMany(mappedBy = "userId", cascade = CascadeType.ALL, orphanRemoval = true)
7065
private List<Post> posts = new ArrayList<>();
7166

72-
// 북마크 폴더
67+
// 북마크 폴더 (계정당 1개)
7368
@OneToOne(mappedBy = "userId", cascade = CascadeType.ALL, orphanRemoval = true)
74-
private BookmarkFolder bookmarkFolderId;
75-
// 우선은 계정 당 폴더 하나만 있는 걸로 생성
76-
// @OneToMany(mappedBy = "userId", cascade = CascadeType.ALL, orphanRemoval = true)
77-
// private List<BookmarkFolder> bookmarkFolders = new ArrayList<>();
78-
79-
// Member 객체를 정적 팩토리 방식으로 회원가입 시에 생성하는 메서드
80-
// Member 객체를 정적 팩토리 방식으로 생성하는 메서드
81-
// Creates a Member object using a static factory method
69+
private BookmarkFolder bookmarkFolder;
70+
71+
// 정적 팩토리 메서드
8272
public static Member of(String email, String password, String nickname, SocialType socialType) {
8373
Member member = new Member();
8474
member.email = email;
8575
member.password = password;
8676
member.nickname = nickname;
8777
member.socialType = socialType;
8878
member.isDeleted = false;
89-
member.profileImageUrl = null; // 디폴트 이미지는 db에 null로 저장하고 프론트한테는 기본 이미지 링크로 반환하는 방향으로 통일
79+
member.profileImageUrl = null; // 기본 이미지는 응답 시 처리
9080
return member;
9181
}
9282

83+
// -------------------- 도메인 메서드 --------------------
84+
85+
public void updateNickname(String nickname) {
86+
this.nickname = nickname;
87+
}
88+
89+
public void updatePassword(String encodedPassword) {
90+
this.password = encodedPassword;
91+
}
92+
93+
public void updateProfileImage(String url) {
94+
this.profileImageUrl = url;
95+
}
96+
97+
public void updateBio(String bio) {
98+
this.bio = bio;
99+
}
100+
101+
public void markAsDeleted() {
102+
this.isDeleted = true;
103+
}
104+
105+
// -------------------- Spring Security --------------------
93106

94107
@Override
95108
public Collection<? extends GrantedAuthority> getAuthorities() {
@@ -98,28 +111,26 @@ public Collection<? extends GrantedAuthority> getAuthorities() {
98111

99112
@Override
100113
public String getUsername() {
101-
return this.email; // 로그인 시 사용할 사용자 식별자
114+
return this.email; // 로그인 시 사용할 식별자
102115
}
103116

104117
@Override
105118
public boolean isAccountNonExpired() {
106-
return true; // 계정 만료 여부 (true = 사용 가능)
119+
return true; // 계정 만료 안 됨
107120
}
108121

109122
@Override
110123
public boolean isAccountNonLocked() {
111-
return true; // 계정 잠금 여부 (true = 잠금 아님)
124+
return true; // 잠금 아님
112125
}
113126

114127
@Override
115128
public boolean isCredentialsNonExpired() {
116-
return true; // 비밀번호 만료 여부
129+
return true; // 비밀번호 만료 안 됨
117130
}
118131

119132
@Override
120133
public boolean isEnabled() {
121-
return !this.isDeleted; // 탈퇴 여부 기반 활성 상태
134+
return !this.isDeleted; // 탈퇴 계정은 비활성화
122135
}
123-
124-
125136
}

src/main/java/com/example/FixLog/dto/member/LoginResponseDto.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ public class LoginResponseDto {
1515
private String nickname;
1616
private String profileImageUrl;
1717

18-
// 정적 팩토리 메서드
1918
public static LoginResponseDto from(Member member, String accessToken) {
2019
return new LoginResponseDto(
2120
member.getUserId(),
@@ -26,4 +25,4 @@ public static LoginResponseDto from(Member member, String accessToken) {
2625
: DefaultImage.PROFILE
2726
);
2827
}
29-
}
28+
}
Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package com.example.FixLog.dto.member;
22

3-
import com.example.FixLog.domain.member.Member;
43
import com.example.FixLog.domain.member.SocialType;
5-
import com.example.FixLog.util.DefaultImage;
6-
import com.example.FixLog.util.DefaultText;
74
import lombok.AllArgsConstructor;
85
import lombok.Getter;
96

7+
// 서비스단에서 최대한 처리하도록 수정
108
@Getter
119
@AllArgsConstructor
1210
public class MemberInfoResponseDto {
@@ -15,18 +13,4 @@ public class MemberInfoResponseDto {
1513
private String profileImageUrl;
1614
private String bio;
1715
private SocialType socialType;
18-
19-
public static MemberInfoResponseDto from(Member member) {
20-
return new MemberInfoResponseDto(
21-
member.getEmail(),
22-
member.getNickname(),
23-
member.getProfileImageUrl() != null
24-
? member.getProfileImageUrl()
25-
: DefaultImage.PROFILE,
26-
member.getBio() != null
27-
? member.getBio()
28-
: DefaultText.BIO,
29-
member.getSocialType()
30-
);
31-
}
3216
}

0 commit comments

Comments
 (0)