-
Notifications
You must be signed in to change notification settings - Fork 0
MA_02 구현 #22 #25
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
MA_02 구현 #22 #25
Changes from all commits
571720a
0205327
1812935
fb18767
d17595b
c4629d2
94cbd0e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -43,7 +43,7 @@ class Member( | |||||||||||||||
var isCouple: Boolean = false, | ||||||||||||||||
|
||||||||||||||||
@Column(name = "emotion") | ||||||||||||||||
var emotion: String = "", | ||||||||||||||||
var emotion : Int? = null, | ||||||||||||||||
|
||||||||||||||||
@Column(name = "fcm_token", nullable = false) | ||||||||||||||||
var fcmToken: String = "", | ||||||||||||||||
|
@@ -74,4 +74,12 @@ class Member( | |||||||||||||||
fun updateCoupleStatus() { | ||||||||||||||||
this.isCouple = !this.isCouple | ||||||||||||||||
} | ||||||||||||||||
|
||||||||||||||||
fun updateEmotion(emotion: Int) { | ||||||||||||||||
this.emotion = emotion | ||||||||||||||||
} | ||||||||||||||||
Comment on lines
+78
to
+80
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion emotion 값 유효성 검증 추가 필요
fun updateEmotion(emotion: Int) {
+ require(emotion in 1..7) { "감정 값은 1에서 7 사이여야 합니다." }
this.emotion = emotion
} |
||||||||||||||||
|
||||||||||||||||
fun updateStatusMessage(statusMessage: String) { | ||||||||||||||||
this.statusMessage = statusMessage | ||||||||||||||||
} | ||||||||||||||||
Comment on lines
+82
to
+84
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 상태 메시지 길이 제한 검증 누락
fun updateStatusMessage(statusMessage: String) {
+ require(statusMessage.length <= 25) { "상태 메시지는 25자 이하여야 합니다." }
this.statusMessage = statusMessage
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package gomushin.backend.member.dto.request | ||
|
||
import io.swagger.v3.oas.annotations.media.Schema | ||
|
||
|
||
data class UpdateMyEmotionAndStatusMessageRequest( | ||
@Schema(description = "이모지(1 : 보고싶어요, 2: 기분 좋아요, 3 : 아무느낌 없어요, " + | ||
"4 : 피곤해요, 5: 서운해요, 6 : 걱정돼요, 7 : 짜증나요)", example = "1") | ||
val emotion : Int, | ||
|
||
@Schema(description = "상태 메시지", example = "보고 싶어요") | ||
val statusMessage : String | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package gomushin.backend.member.dto.response | ||
|
||
import gomushin.backend.member.domain.entity.Member | ||
|
||
data class MyStatusMessageResponse ( | ||
val statusMessage : String? | ||
) { | ||
companion object { | ||
fun of(member: Member) = MyStatusMessageResponse( | ||
member.statusMessage | ||
) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -4,6 +4,7 @@ import gomushin.backend.member.domain.entity.Member | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import gomushin.backend.member.domain.repository.MemberRepository | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import gomushin.backend.member.domain.value.Provider | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import gomushin.backend.member.domain.value.Role | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.junit.jupiter.api.DisplayName | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.junit.jupiter.api.Test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import org.junit.jupiter.api.extension.ExtendWith | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -46,4 +47,30 @@ class MemberServiceTest { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assertEquals(expectedMember, result) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@DisplayName("이모지 및 상태 메시지 업데이트 - 성공") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@Test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fun updateMyEmotionAndStatusMessage() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// given | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
val memberId = 1L | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
val expectedMember = Member( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id = 1L, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
name = "테스트", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
nickname = "테스트 닉네임", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
email = "[email protected]", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
birthDate = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
profileImageUrl = null, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
provider = Provider.KAKAO, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
role = Role.GUEST, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
emotion = 1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
statusMessage = "상태 변경전" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(2, "상태 변경후") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//when | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`when`(memberRepository.findById(memberId)).thenReturn(Optional.of(expectedMember)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
val result = memberService.updateMyEmotionAndStatusMessage(memberId, updateMyEmotionAndStatusMessageRequest) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assertEquals(expectedMember.emotion, updateMyEmotionAndStatusMessageRequest.emotion) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assertEquals(expectedMember.statusMessage, updateMyEmotionAndStatusMessageRequest.statusMessage) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+51
to
+75
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 테스트 메서드 개선 필요 테스트 구현에 몇 가지 개선이 필요합니다:
@DisplayName("이모지 및 상태 메시지 업데이트 - 성공")
@Test
fun updateMyEmotionAndStatusMessage() {
// given
val memberId = 1L
val expectedMember = Member(
id = 1L,
name = "테스트",
nickname = "테스트 닉네임",
email = "[email protected]",
birthDate = null,
profileImageUrl = null,
provider = Provider.KAKAO,
role = Role.GUEST,
emotion = 1,
statusMessage = "상태 변경전"
)
val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(2, "상태 변경후")
//when
- `when`(memberRepository.findById(memberId)).thenReturn(Optional.of(expectedMember))
- val result = memberService.updateMyEmotionAndStatusMessage(memberId, updateMyEmotionAndStatusMessageRequest)
+ `when`(memberRepository.findByIdOrNull(memberId)).thenReturn(expectedMember)
+ memberService.updateMyEmotionAndStatusMessage(memberId, updateMyEmotionAndStatusMessageRequest)
//then
assertEquals(expectedMember.emotion, updateMyEmotionAndStatusMessageRequest.emotion)
assertEquals(expectedMember.statusMessage, updateMyEmotionAndStatusMessageRequest.statusMessage)
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,6 +5,7 @@ import gomushin.backend.member.domain.entity.Member | |
import gomushin.backend.member.domain.service.MemberService | ||
import gomushin.backend.member.domain.value.Provider | ||
import gomushin.backend.member.domain.value.Role | ||
import gomushin.backend.member.dto.request.UpdateMyEmotionAndStatusMessageRequest | ||
import org.junit.jupiter.api.BeforeEach | ||
import org.junit.jupiter.api.DisplayName | ||
import org.junit.jupiter.api.Test | ||
|
@@ -37,6 +38,7 @@ class MemberInfoFacadeTest { | |
profileImageUrl = null, | ||
provider = Provider.KAKAO, | ||
role = Role.MEMBER, | ||
statusMessage = "상태 메시지" | ||
) | ||
|
||
customUserDetails = mock(CustomUserDetails::class.java) | ||
|
@@ -56,4 +58,27 @@ class MemberInfoFacadeTest { | |
verify(memberService).getById(1L) | ||
assertEquals(member.nickname, result.nickname) | ||
} | ||
|
||
@DisplayName("내 상태 메시지 조회") | ||
@Test | ||
fun getMyStatusMessage() { | ||
//given | ||
`when`(memberService.getById(customUserDetails.getId())).thenReturn(member) | ||
//when | ||
val result = memberInfoFacade.getMyStatusMessage(customUserDetails) | ||
//then | ||
verify(memberService).getById(1L) | ||
assertEquals(member.statusMessage, result.statusMessage) | ||
} | ||
|
||
@DisplayName("이모지 및 상태 메시지 업데이트") | ||
@Test | ||
fun updateMyEmotionAndStatusMessage() { | ||
//given | ||
val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(1, "좋은 날씨야") | ||
//when | ||
val result = memberInfoFacade.updateMyEmotionAndStatusMessage(customUserDetails, updateMyEmotionAndStatusMessageRequest) | ||
//then | ||
verify(memberService).updateMyEmotionAndStatusMessage(1L, updateMyEmotionAndStatusMessageRequest) | ||
} | ||
Comment on lines
+74
to
+83
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion 이모지 및 상태 메시지 업데이트 테스트 개선 필요 이모지 및 상태 메시지 업데이트 기능에 대한 테스트가 구현되었지만, 결과값에 대한 구체적인 검증이 누락되었습니다. 서비스 메소드 호출 여부만 검증하고 있어, 실제 반환값이나 상태 변경에 대한 검증이 필요합니다. @DisplayName("이모지 및 상태 메시지 업데이트")
@Test
fun updateMyEmotionAndStatusMessage() {
//given
val updateMyEmotionAndStatusMessageRequest = UpdateMyEmotionAndStatusMessageRequest(1, "좋은 날씨야")
+ val updatedMember = Member(
+ id = 1L,
+ name = "테스트",
+ nickname = "테스트 닉네임",
+ email = "[email protected]",
+ profileImageUrl = null,
+ provider = Provider.KAKAO,
+ role = Role.MEMBER,
+ emotion = 1,
+ statusMessage = "좋은 날씨야"
+ )
+ `when`(memberService.updateMyEmotionAndStatusMessage(1L, updateMyEmotionAndStatusMessageRequest)).thenReturn(updatedMember)
//when
val result = memberInfoFacade.updateMyEmotionAndStatusMessage(customUserDetails, updateMyEmotionAndStatusMessageRequest)
//then
verify(memberService).updateMyEmotionAndStatusMessage(1L, updateMyEmotionAndStatusMessageRequest)
+ assertEquals(updatedMember, result)
} |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
❓ Verification inconclusive
보안 취약점: 쿠키 secure 플래그가 비활성화되었습니다.
개발 환경에서는 적절할 수 있지만, 쿠키의 secure 플래그를 false로 설정하면 HTTP를 통해 민감한 쿠키가 전송될 수 있으므로 보안 위험이 있습니다. 주석에 작성된 대로 배포 시에는 반드시 true로 변경해야 합니다.
다음과 같이 환경에 따라 자동으로 설정되도록 변경할 것을 권장합니다:
🏁 Script executed:
Length of output: 106
쿠키 secure 플래그 설정 자동화 필요
현재
CustomSuccessHandler.kt
의cookie.secure = false
가 하드코딩되어 있어 배포 시에도 HTTP로 민감한 쿠키가 전송될 수 있는 보안 취약점이 존재합니다. 운영 환경에서는 반드시secure = true
로 설정되어야 하므로, 환경에 따라 자동으로 설정하도록 아래와 같이 수정하세요.예시 (application.yml):
COOKIE_SECURE=true
를 설정하여 자동 반영되도록 구성위 작업을 통해 개발 환경에서는 기본값(false)을, 운영 환경에서는 true를 자동으로 적용하여 보안 취약점을 제거할 수 있습니다.