-
Notifications
You must be signed in to change notification settings - Fork 6
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
[BE] Topic 패키지 관련 코드 리팩토링 #238
Conversation
Co-authored-by: jaeyeon kim <[email protected]>
Co-authored-by: jaeyeon kim <[email protected]>
…/2023-map-befine into feature/junepark-member
Co-authored-by: jaeyeon kim <[email protected]>
- 패키지 재분배 - AUTH 관련 기능 구현 - TopicController 및 LocationController 분리 Co-authored-by: jaeyeon kim <[email protected]>
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.
쥬니 너무 고생하셨습니다!!
몇개 의견 남겼습니다 확인 부탁드려용.
private Long createTopic(AuthMember member, TopicCreateRequest request) { | ||
List<Long> pinIds = request.pins(); | ||
|
||
if (pinIds.isEmpty()) { | ||
return topicCommandService.saveEmptyTopic(member, request); | ||
} | ||
|
||
return topicCommandService.saveTopicWithPins(member, request); |
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.
emptyTopic 과 topicWithPins 를 나눈 이유가 있을까요?
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.
나누더라도 해당 분기가 Service 내에서 발생해도 괜찮을 것 같은데
어떤 이유에서 컨트롤러에 두셨나요?
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.
하나의 메서드는 하나의 기능만을 수행한다.
Service 내부에서 두 메서드는 서로 다른 기능을 수행하기 때문에 분리했습니다.
해당 코드가 서비스의 흐름을 제어하는 것 처럼 보이기 때문에 잘못된 구조로 보일수도 있을 것 같습니다.
하지만 이는, 해당 컨트롤러에서 사용하는 API 스펙이 동일하기 때문에 발생하는 문제라고 생각합니다.
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.
토픽을 생성한다는 기능 자체는 하나가 아닐까요?
저희가 API 스펙을 동일하게 정했을 때 모두가 동의를 하고 넘어간 건
이게 하나의 기능이 맞다고 암묵적인 동의를 했다고 생각합니다.
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.
저희가 API 스펙을 동일하게 정했을 때 모두가 동의를 하고 넘어간 건
이게 하나의 기능이 맞다고 암묵적인 동의를 했다고 생각합니다.
준팍 말씀에 동의합니다 ! 토픽을 생성한다는 기능은 하나로 볼 수 있을 것 같아요.
근데 저는 "토픽 생성" 이라는 기능을 조금 더 작은 단위로 생각했던 것 같아요.
(1) 비어있는 토픽 생성, (2) 핀을 통해 토픽 생성 으로요 ㅎㅎ
각 기능에 대해 하나의 API 명세로 가자고 동의가 되었다면, Service 구현 과정에서도 이 부분을 고려해야 했던 것 같아요.
만약, API 스펙을 동일하게 하자는 이야기가 해당 기능 구현 이후였다면, API를 고려한 서비스를 구현하는 것은 옳지 않다라고 이야기 했을 테지만, 제 불착입니다 !
분기처리는 Service에서 하는 것으로 수정하여 반영하였습니다 ~!
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.
저도 하나의 기능이기에 Service에서 분기를 두는 쪽에 동의합니다!
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.
추가적으로 의견을 달자면, Service에서 분기처리했을 때 나오는 아래와 같은 구조가 어색했던 것 같아요.
public Long saveTopic(AuthMember member, TopicCreateRequest request) {
List<Long> pinIds = request.pins();
if (pinIds.size() > 0) {
return saveTopicWithPins(member, request);
}
return saveEmptyTopic(member, request);
}
return 하는 부분에서 저장하는 로직을 수행하는 것이 어색하다고 느끼는건 저뿐일까요 ㅠ_ㅠ
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.
혼란을 드려 죄송합니다 ~
생각을 잘못 했어요.. 아래와 같이 수정하면 자연스럽네요 ㅎㅎ
public Long saveTopic(AuthMember member, TopicCreateRequest request) {
Topic topic = convertToTopic(member, request);
List<Long> pinIds = request.pins();
if (pinIds.size() > 0) {
copyPinsToTopic(member, topic, pinIds);
}
topicRepository.save(topic);
return topic.getId();
}
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.
쥬니 갓...
throw new IllegalArgumentException("조회할 수 없는 Topic 입니다."); | ||
} | ||
|
||
// TODO: 2023/08/07 토픽의 id가 존재하지 않는 경우도 검증해야 하는가 ? |
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.
제가 생각했을 때는 검증하는 것이 좋을 것 같다는 생각이 들어요!
사용자가 웹을 통해 접근한 경우를 고려해봤을 때, 해당 메서드를 통해 전달된 토픽의 id 가 존재하지 않는 경우라면, 사용자가 해당 토픽을 선택할 때에는 존재했지만, 같이 보기를 누르기 이전에 사라진 경우일 것 같아요.
저희가 이전에 delete 할 때 id가 존재하지 않는 경우를 검증해야 하는가에 대해서 토의할 때, 쥬니 말을 빌리면, 사용자가 삭제하려던 토픽이었으니 삭제하기 이전에 이미 삭제되었어도 사용자의 의도대로 된 것이니까 상관이 없지만, 이번에는 사용자가 해당 토픽의 내용을 보려고하는데 사라진 경우이니 사용자의 의도와 다른 방향으로 흘러갔다고 생각이 들기 때문에 예외를 터트리는 것이 맞을 것 같다는 생각이 드네요!
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.
해당 사항 검증 로직 추가 및 테스트 추가 구현 완료하였습니다 !
/** | ||
* createPinAssociatedWithLocationAndTopic을 재사용하지 않은 이유 | ||
* 내부적으로 copy를 처리하면, 반환값이 필요 없음 -> 외부에서 반환값을 무시함 | ||
* 반환값이 있을 경우, topic과의 연관관계를 맺어주지 않은 상태로 반환하고, | ||
* 외부에서 해당 연관관계를 맺어주어도 됨 -> 이 방법은 객체가 불안정한 상태라고 판단 됨. | ||
*/ | ||
|
||
public void copyToTopic(Topic otherTopic) { | ||
PinInfo copiedPinInfo = PinInfo.of(pinInfo.getName(), pinInfo.getDescription()); | ||
Pin copiedPin = new Pin(copiedPinInfo, location, otherTopic); | ||
location.addPin(copiedPin); | ||
|
||
otherTopic.addPin(copiedPin); | ||
} |
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.
createPinAssociatedWithLocationAndTopic 은 반환값이 있기 때문에 사용하지 않았다는 말씀이신 건가용?
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.
간단하게 정리하자면 맞는 말씀입니당
한줄요약
create~를 사용하면 반환 값이 발생하는데, copy가 필요한 곳에서 해당 반환 값을 사용하지 않는다. 즉, 반환 값을 무시하게 된다.
saveAllReadableTopicOfCount(1); | ||
saveOnlyMemberReadableTopicOfCount(2); |
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.
오 이거 기가막히네요 ㅋㅋㅋㅋ
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.
쥬니 코드 잘 봤습니다~!!
궁금한 점 댓글 남겨봤습니다 ㅎㅎ
if (copyablePinCount != originalPins.size()) { | ||
throw new IllegalArgumentException("복사할 수 없는 pin이 존재합니다."); | ||
} |
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.
validation 훌륭한데요?
TopicInfo topicInfo = TopicInfo.of(name, description, imageUrl); | ||
TopicStatus topicStatus = TopicStatus.of(publicity, permission); | ||
Topic topic = new Topic(topicInfo, topicStatus, creator); |
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.
저희 파라미터의 길이에 상관 없이 3개 이상이면 개행하기로 하지 않았나요?
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.
@yoondgu @kpeel5839 우리 이거 얘기해봐요 .....ㅠ_ㅠ
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.
처음 정할 때는 기준이 모호해지는 것때문에 무조건 하자고 얘기했었지만,
위 코드 같은 경우 개행이 오히려 가독성을 저해한다는 생각이 들긴 해요.. ㅜㅜ
또, 메서드 호출 시에도 파라미터에 개행을 하다보니 한 메서드 내 라인 수가 늘면서 읽기 피곤해지는 경우도 있더라고요.
그래서 메서드 호출 시에는 파라미터의 변수명이 길거나 개수가 많아서 한 줄을 넘어갈 때에만 개행을 하는 방법도 생각이 들어요
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.
저도 인정합니다
if (name == null) { | ||
throw new IllegalArgumentException("name null"); | ||
} |
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.
null인 경우의 예외 메시지도 단순히 null이라고 표현하는 것보다 메시지를 정확히 적어주시는 건 어떨까요?
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.
TopicInfo를 크게 신경 못 썼네요 ㅎㅎ..
해당 사항 아래와 같이 수정했습니다 !
private static void validateName(String name) {
if (Objects.isNull(name)) {
throw new IllegalArgumentException("이름은 null일 수 없스빈다.");
}
if (name.isBlank() || name.length() > MAX_NAME_LENGTH) {
throw new IllegalArgumentException("이름 길이 이상");
}
}
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.
스빈다요?ㅋㅋㅋ
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.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 수정했습니다 ..
if (RegexUtil.matches(IMAGE_URL_REGEX, imageUrl)) { | ||
return; | ||
} | ||
|
||
throw new IllegalArgumentException("잘못된 형식의 URL입니다."); |
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.
저랑 취향이 비슷하시군요 ㅋㅋ 좋습니다
if (Objects.isNull(member.getMemberId())) { | ||
throw new IllegalArgumentException("Guest는 토픽을 생성할 수 없습니다."); | ||
} |
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.
validation 좋네요 👍
public ResponseEntity<Void> mergeAndCreate(AuthMember member, | ||
@RequestBody TopicMergeRequest request) { |
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.
개행 해주시면 더 좋을 것 같습니다
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.
이 부분을 놓쳤네요 !! 반영했습니다 !
*/ | ||
|
||
public void copyToTopic(Topic otherTopic) { | ||
PinInfo copiedPinInfo = PinInfo.of(pinInfo.getName(), pinInfo.getDescription()); |
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.
이거 PinInfo를 새로 생성해야할 필요가 있을까요?
PinInfo는 Id값이 없는 단순한 VO라서 기존의 PinInfo를 바로 넣어줘도 될 것 같습니다!
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.
VO라고 하기에는 내부에 값을 변경할 수 있는 update가 존재하고, 불변을 보장할 수 없지 않나요 ?
기존의 pinInfo를 그대로 사용한다고 가정했을 때, 하나의 트랜잭션에서
(1) 기존의 핀들을 복사한다.
(2) 복사된 핀의 값을 변경(update)한다.
라는 로직이 수행된다면, 기존의 핀의 데이터에도 변화가 생길 것 같아요.
현재 존재하는 기능은 아니지만, 특정 핀을 복사해서 나의 토픽으로 넣을 때 핀의 정보를 수정해서 넣을 수 있게끔 하는 기능이 추가될 수 있지 않을까요 ?
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.
제가 (2) 사례를 고려하지 못했군요 ㅋㅋ
* createPinAssociatedWithLocationAndTopic을 재사용하지 않은 이유 | ||
* 내부적으로 copy를 처리하면, 반환값이 필요 없음 -> 외부에서 반환값을 무시함 | ||
* 반환값이 있을 경우, topic과의 연관관계를 맺어주지 않은 상태로 반환하고, | ||
* 외부에서 해당 연관관계를 맺어주어도 됨 -> 이 방법은 객체가 불안정한 상태라고 판단 됨. |
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.
copyToTopic 메서드에서 반환값이 필요 없다는 생각은 동의합니다.
근데 반환 값이 있을 경우, topic과의 연관관계를 맺어주지 않은 상태로 반환한다는 말이
무슨 의미인지 잘 이해가 되지 않네요.
createPinAssociatedWithLocationAndTopic
내의 topic.addPin(pin)
이 연관관계를 맺어주고 있지 않나요?
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.
간략하게 쓰려다보니 생략된 부분이 다소 존재해서, 혼란의 여지가 있었던 것 같아요.
반환값이 있을 경우, topic과의 연관관계를 맺어주지 않은 상태로 반환하고,
외부에서 해당 연관관계를 맺어주어도 됨 -> 이 방법은 객체가 불안정한 상태라고 판단 됨.
의 의미는 다음과 같습니다.
(1) copyToTopic
메서드를 사용하지 않고 createPinAssociatedWithLocationAndTopic
를 재사용할 경우 반환 값을 외부에서 사용해야 한다. (반환 값을 무시하지 말아야 한다고 생각하기 때문에)
(2) (억지로라도 ?) 외부에서 사용할 수 있도록 하는 방법은 외부에서 연관관계를 맺어주는 방법이 있다.
(3) (2)의 방법을 위해서는 기존의 createPinAssociatedWithLocationAndTopic
에서 연관관계를 맺어주는 로직을 제거하고, 해당 메서드를 호출하는 쪽에서 연관관계를 맺어주도록 수정한다.
(4) 이 방법은 객체를 불안정한 상태로 반환하는 것과 같다.
(5) 따라서, 별도의 메서드로 분리했다.
글로 표현하려다보니 전달이 잘 안될 수도 있을 것 같네요.
혹시 이해가 안 되신다면 다시 한 번 말씀해주세요 !
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.
이 부분을 놓쳐서 추가 코멘트 남깁니다!
(1)에서 반환값을 무시하지 말아야 한다고 생각하는 이유는, 반환값을 사용하지 않으면 불필요한 값을 반환하는 메소드 호출이 되기 때문일까요?
그렇다면 update 후 변경된 행의 개수를 반환하는 메서드 같은 경우는 어떻게 생각하시나요?
저는 해당 메서드를 사용할 때 절대 반환값을 쓸 일이 없다면 비효율적인 행위겠지만, 그게 아니라면 반환값의 사용은 꼭 필수는 아니라는 생각이 들어서 여쭤봅니다!
또, Pin 리팩터링 PR에 반영되어있는 Pin.copy 메서드를 보시면,
Pin 객체는 Pin.createXXX 메서드로만 생성할 것이라 기대하여 해당 메서드에서 PinImage의 복사를 함께 하도록 작성했는데요.
이 부분에 대한 고려도 같이 해야 할 것 같습니다!
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.
(1)에서 반환값을 무시하지 말아야 한다고 생각하는 이유는, 반환값을 사용하지 않으면 불필요한 값을 반환하는 메소드 호출이 되기 때문일까요?
제가 아는 선에서는 "프로그래머가 예상치 못한 동작을 할 수 있다"라는 이유에서의 권장사항으로 알고 있습니다.
관련 링크
그렇다면 update 후 변경된 행의 개수를 반환하는 메서드 같은 경우는 어떻게 생각하시나요?
저는 변경 된 행의 개수를 검증하는 것도 필요하다고 생각해요.
예를 들어, 내가 id값을 통해 update하여 변경하려던 행의 개수가 1개라고 예상을 했었는데, 실제로 2개의 행이 변경될 수 있죠.
(테이블의 제약조건을 잘못 설정했거나 하는 이유로)
위 상황에서 이를 무시하게 되면 프로그래머가 예상치 못한 동작을 할 수도 있다고 생각해요.
그래서 반환 값을 무시하지 않고 검증을 수행해야 한다고 생각하는 편이에요.
물론, List의 add 메서드에서도 성공/실패 여부를 반환해주지만, 이는 대부분 무시하잖아요 ?
이는 위의 데이터베이스 예제와는 다르게, 프로그래머의 실수로 인해 add가 잘못 동작하는 경우가 없어서 무시하는 것이라고 생각해요.
(예외가 아닌, 예기치 못한 동작을 말하는 겁니다 !!)
저는 해당 메서드를 사용할 때 절대 반환값을 쓸 일이 없다면 비효율적인 행위겠지만, 그게 아니라면 반환값의 사용은 꼭 필수는 아니라는 생각이 들어서 여쭤봅니다!
사실, 권장사항일 뿐 항상 지켜야 하는 것은 아니라고 생각해요.
재사용하지 않은 이유에 대해 추가적인 의견을 덧붙이자면, 재사용했을 때의 코드를 확인하면 조금은 납득이 되실까 싶어요.
// Pin 클래스의 일부
public void copyToTopic(Topic otherTopic) {
createPinAssociatedWithLocationAndTopic(
pinInfo.getName(),
pinInfo.getDescription(),
location,
otherTopic
);
}
저는 위 코드에서 메서드 이름과는 다르게, 핀을 복사한다는 로직이 안 보이는 것 같아요.
또한, createXXX 메서드를 재사용 하게 됐을 경우, 나중에 정책이 변경되면 copyToTopic
메서드에도 영향이 가지 않을까요?
예를 들어, 핀 사진에 대한 저작권 문제로 인해, 복사시에는 핀 사진을 제외하고 복사해야하는 경우에요 !
파라미터에 null을 넣어주는 방법도 있겠지만, Pin과 PinImage 사이의 연관관계 매핑을 해주는 작업에서 문제가 발생하지 않을까 싶네요.
(적절하지 않은 예시일수도 있습니다 ㅎㅎ)
추가적인 질문이나, 의견 환영입니다 !!
글 쓰는 솜씨가 없어서, 의사 전달이 제대로 이루어졌을지 모르겠네요.
이해가 안 되는 부분이 있다면 내일 추가적으로 이야기해봅시다 !
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.
자세히 설명해주셔서 이해가 갔습니다 !!
저는 반대로 copy도 사실상 객체 생성이기 때문에 정책 변경 시 copyToTopic에 영향이 가는 것이 당연하다고 생각했고,
객체를 생성하는 방식이 여러 가지로 분화된다는 점이 걸려요!
하지만 반환값을 쓰지 않는 것을 지양하고자 하는 이유도 이해가 가서 다른 분들 의견까지 마저 듣고 정리하면 좋겠네요!
List<Pin> originalPins = findAllPins(request.pins()); | ||
validateCopyablePins(member, originalPins); | ||
copyPinsToTopic(originalPins, topic); |
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.
SaveEmptyTopic
과 saveTopicWithPins
을 굳이 나눠줄 필요 있을까요?
해당 부분만
pinIds = request.pins();
if (pinIds.size() > 0) {
List<Pin> originalPins = findAllPins(pinIds);
validateCopyablePins(member, originalPins);
copyPinsToTopic(originalPins, topic);
}
이렇게 처리하면 한 메서드로 처리 가능할 것 같습니다.
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.
(메서드 명만 보고 해당 로직이 무엇인지 유추할 수 있게 하기 위해) 조건문에 따라 다른 로직을 수행한다면, 이는 메서드로 분리해야 한다고 생각해요 !
이럴 경우, 해당 코멘트에도 남겨놓았지만 해당 구조가 조금 어색하게 느껴지네요.. 메서드 분리를 하지 말아야 할까요
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.
ㅎㅎㅎㅎㅎㅎㅎㅎ 생각을 잘못 했네요 수정했습니다
|
||
topic.updateTopicInfo(request.name(), request.description(), request.image()); | ||
} | ||
|
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.
updateTopicStatus도 수정하는 메서드가 필요할 것 같습니다
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.
해당 사항 반영했습니다 !
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.
P1: 꼭 반영해주세요 (Request changes)
P2: 적극적으로 고려해주세요 (Request changes)
P3: 웬만하면 반영해 주세요 (Comment)
P4: 반영해도 좋고 넘어가도 좋습니다 (Approve)
P5: 그냥 사소한 의견입니다 (Approve)
쥬니 고생 많으셨습니다!! ㅎㅎ 꼼꼼하게 잘 해주셔서 오히려 제가 반영해야 할 부분이랑, 같이 얘기할 만한 것들 위주로 코멘트 남겼습니다!
private Long createTopic(AuthMember member, TopicCreateRequest request) { | ||
List<Long> pinIds = request.pins(); | ||
|
||
if (pinIds.isEmpty()) { | ||
return topicCommandService.saveEmptyTopic(member, request); | ||
} | ||
|
||
return topicCommandService.saveTopicWithPins(member, request); |
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.
저도 하나의 기능이기에 Service에서 분기를 두는 쪽에 동의합니다!
} | ||
|
||
@GetMapping("/{id}") | ||
public ResponseEntity<TopicDetailResponse> findById(AuthMember member, @PathVariable Long id) { |
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.
P3. 사소한 부분이긴 한데, 한 클래스 내에서 id와 topicId 변수명이 둘 다 쓰이는데 topicId
로� 통일하면 어떨까요?
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.
topicId라는 변수명으로 통일 했습니다 ~!
TopicInfo topicInfo = TopicInfo.of(name, description, imageUrl); | ||
TopicStatus topicStatus = TopicStatus.of(publicity, permission); | ||
Topic topic = new Topic(topicInfo, topicStatus, creator); |
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.
처음 정할 때는 기준이 모호해지는 것때문에 무조건 하자고 얘기했었지만,
위 코드 같은 경우 개행이 오히려 가독성을 저해한다는 생각이 들긴 해요.. ㅜㅜ
또, 메서드 호출 시에도 파라미터에 개행을 하다보니 한 메서드 내 라인 수가 늘면서 읽기 피곤해지는 경우도 있더라고요.
그래서 메서드 호출 시에는 파라미터의 변수명이 길거나 개수가 많아서 한 줄을 넘어갈 때에만 개행을 하는 방법도 생각이 들어요
Permission permission, | ||
Member creator | ||
) { | ||
TopicInfo topicInfo = TopicInfo.of(name, description, imageUrl); |
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.
P3. 매튜 PR에 남긴 코멘트와 같은 내용인데, 통일하는 게 좋을 것 같아 똑같이 의견 여쭐게요! (TopicInfo를 외부에서 받기)
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.
P3. 이 부분은 취향 차이일 것 같은데, 한 방향으로 통일하면 좋을 것 같아서 의견 여쭤봅니다!
Pin과 PinInfo의 경우 저는 생성 시 파라미터에서 포장된 PinInfo를 직접 받도록 변경했습니다. (관련 커밋)
이렇게 하면
Pin에 쓰이는 name, email, imageUrl, role이 PinInfo의 검증 로직을 거친다는 사실을 명시할 수 있고
PinInfo에 필드가 추가되어도, Pin의 생성자 파라미터를 수정할 필요가 없기 때문입니다.
매튜의 생각은 어떠신가요?!
[도이의 코멘트] (#237 (comment))
제 의견은 아래와 같습니다 !
Pin에 쓰이는 name, email, imageUrl, role이 PinInfo의 검증 로직을 거친다는 사실을 명시할 수 있고
저는 PinInfo의 검증 로직을 거친다는 사실을 명시하는 것의 장점이 무엇인지 잘 모르겠어요.
혹시, Pin 관련 정책(이름 길이 등)을 확인할 때, 접근하는 depth를 줄일 수 있다는 것일까요 ?
이와 관련하여 의견 주시면 감사하겠습니다 !
오히려 저는 각 데이터를 그대로 매개변수로 전달하여야 한다고 생각하는 편이긴 해요.
현재는 단순히 PinInfo를 만들기 위해서 값을 그대로 사용하지만, 정적 팩토리 메서드 내부에서 별도의 정책에 따라 해당 데이터를 가공하는 경우가 있지 않을까요 ?
물론, PinInfo에서는 마땅한 예시가 없는 것 같지만 다른 정적 팩토리 메서드에서도 동일하게 적용한다면, 위와 같은 문제가 발생할수도 있을 것 같아서요 !
PinInfo에 필드가 추가되어도, Pin의 생성자 파라미터를 수정할 필요가 없기 때문입니다.
Pin의 생성자 파라미터라는 것이 정적 팩토리 메서드(이하 정팩메)의 파라미터를 말씀하신 것이겠죠 ?
이 부분은 확실히 매리트 있는 것 같아요.
하지만, PinInfo를 생성하는 정팩메에서는 동일하게 파라미터가 추가되어야 할 것이고, Pin을 생성하기 위해 PinInfo를 생성하는 쪽에서도 마찬가지겠죠 ?
코드 전체적인 부분에서는 변경해야 하는 사항이 크게 달라지진 않는다고 생각이 들어요.
도이가 위와 같이 말씀하신 이유는 PinInfo의 변화가 Pin에 영향을 미치지 않게 한다는 것으로 받아들이면 될까요 ?
저는 PinInfo가 Pin에서 사용하기 위한 객체라면 Pin에 영향이 가도 괜찮지 않을까 싶어요 ㅎㅎ..
이 부분은 내일 다 같이 이야기 해봅시다 !!
내일 이야기 후에 정해지게 되면, 상황에 맞게 반영하도록 할게요 !
String imageUrl | ||
) { | ||
topicInfo.update(name, description, imageUrl); | ||
} |
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.
P3. 이 부분도 매튜 PR에 남긴 코멘트와 같은 내용인데, 통일하는 게 좋을 것 같아 똑같이 의견 여쭐게요!
(update는 객체 재할당해서 불변객체처럼 쓰기)
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.
완전 동의합니다 ! 불변 객체처럼 사용하는거 무지 좋아요.
제 코드 상에는 pinInfo가 불변 객체 아니다 보니, 핀을 복사하는 과정에서 새로운 PinInfo를 생성했었는데요.
불변 객체라면 그대로 사용해도 무관할 것 같네요 !!
@@ -9,7 +11,7 @@ public record TopicDetailResponse( | |||
String name, | |||
String description, | |||
String image, | |||
int pinCount, | |||
Integer pinCount, |
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.
P4. Wrapper vs primitive 타입 기준이 어떻게 되시는지 궁금합니다!
null이 오면 안되는 경우, primitive 타입을 써서 이를 드러내는 것이 좋다는 생각도 들어서용
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.
primitive 타입이 null 값이 없지 않나요 !!?
Wrapper 타입을 쓴 이유는 null 값이 들어오면 안 되는 경우라고 생각해서 사용하였습니다.
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.
저는 primitive는 null을 못받기 때문에 오히려 파라미터로 null을 넘길 여지를 없애준다고 생각했습니다!
Wrapper를 쓰면 pinCount에 null이 들어와도 잘못된지 모른 채로 Response가 정상 생성되기 때문에용
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.
그렇군요 !
primitive 타입을 사용한다고 가정하면,
내부 로직이 잘못되어서 토픽에 존재하는 핀의 개수를 null 값으로 처리했을 때, Response에는 0으로 들어가는 것이 잘못된 동작이라고 생각했어요 !
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.
이 경우에는 0이 할당되지 않고 NPE가 터져요!
} | ||
|
||
throw new IllegalArgumentException("업데이트 권한이 없습니다."); | ||
} |
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.
validate을 이렇게 빼니까 훨씬 깔끔하네요!!
.filter(member::canRead) | ||
.map(TopicResponse::from) | ||
.toList(); | ||
} |
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.
findAllReadable이라는 네이밍이 아주 이해하기 좋네요!!
PinQueryService의 findAll 메서드 네이밍도 동일하게 통일하겠습니다 😀
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.
근데 저희 모든 조회 쿼리에서 isDeleted = true 인 건 걸러줘야겠네요....?
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.
맞아요.. 걸러줘야해요..
근데, 아직 유저가 삭제하는 경우가 없다고 해서, 따로 구현하지 않았는데 Repository에서 @Query
어노테이션을 활용하면 될 것 같아요.
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.
} | ||
|
||
throw new IllegalArgumentException("조회할 수 없는 Topic 입니다."); | ||
} |
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.
P3. TopicCommandService와 예외처리 메서드 분리 방식을 통일해도 괜찮을 것 같아요!
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.
어떤 메서드에서는 조건문 안에서 예외를 던지고, 어떤 메서드에서는 조건문 안에서 early return을 해서 이를 통일해달라는 말씀이신거죠 ?
사실 이 부분을 적용하고자 했었는데, 부정 조건문 사용을 지양하려다보니까 통일이 잘 안 되더라구요 ㅠ_ㅠ
혹시 좋은 아이디어 있으실까요 !?
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.
이미 TopicCommandService에서 쓴 방식이 좋아서, 같은 방식으로 하면 좋겠다 싶었어요!!
이렇게요
public TopicDetailResponse findDetailById(AuthMember member, Long topicId) {
Topic topic = findTopic(topicId);
validateReadAuth(member, topic);
return TopicDetailResponse.from(topic);
}
private void validateReadAuth(AuthMember member, Topic topic) {
if (member.canRead(topic)) {
return;
}
throw new IllegalArgumentException("조회 권한이 없습니다.");
}
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.
반영했어요 !!
assertThatThrownBy(() -> topicCommandService.saveTopicWithPins(user, request)) | ||
.isInstanceOf(IllegalArgumentException.class) | ||
.hasMessage("복사할 수 없는 pin이 존재합니다."); | ||
} |
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.
권한에 따른 테스트까지.. 👍👍 핀 관련 테스트에도 반영해야겠어요
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.
수고하셨습니다 쥬니!!
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.
수고 많으셨습니다 !!!
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.
고생했어요 쥬니짜아아앙
* [FE]Chore/#9 프론트엔드 개발 환경 초기 설정 (#11) * chore: frontend 세팅 초기 설정 * chore: eslint validate 수정 * chore: 초기 환경 설정 (#15) * chore: 모듈 시스템 및 ts-parser 오류 해결 (#26) * design: ThemeProvider와 GlobalStyle 공통 스타일 속성 지정 (#27) * 토픽, 핀에 대한 Entity 및 뼈대코드 작성 (#28) * chore: 초기 환경 설정 * feat: 토픽, 핀에 대한 Entity 및 뼈대코드 작성 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * [FE]Feat/#16 공통 컴포넌트 구현 (#30) * feat: Button 컴포넌트 구현 * feat: Input 컴포넌트 구현 * feat: Box 컴포넌트 구현 * feat: Flex 컴포넌트 구현 * feat: Layout 컴포넌트 구현 * refactor: Box 컴포넌트 min-height 속성 추가 * feat: Text 컴포넌트 구현 * refactor: Button 컴포넌트 box-sizing 속성 추가 * refactor: App 컴포넌트 화살표 함수로 변경 * feat: 페이지 폴더 생성 * feat: Spacing 컴포넌트 구현 (#34) * [BE] 토픽, 핀에 대한 Entity 구조 변경 (#36) * chore: 초기 환경 설정 * feat: 토픽, 핀에 대한 Entity 및 뼈대코드 작성 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Getter 추가 및, Coordinate BaseEntity 상속 제거 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: 외래키에 Not Null 조건 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * feat: Repository 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * chore: gradlew 업데이트 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Entity 구조 변경 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * remove: 주소 관련 entity 삭제 * docs: 백엔드 기능 목록 작성 * feat: soft delete를 위한 삭제 상태 추가 --------- Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> Co-authored-by: kpeel5839 <[email protected]> * feat: React Router 기능 구현 (#50) * feat: MSW 초기 설정 및 구동 (#51) * feat: PinDetail 페이지 컴포넌트 구현 (#53) * refactor: 공통 컴포넌트 속성 변경 (#54) * [FE]Feat/#31 �토픽 및 핀 생성 페이지 구현 (#55) * feat: NewPin 페이지 컴포넌트 구현 * feat: NewTopic 페이지 컴포넌트 구현 * feat: Textarea 컴포넌트 구현 * refactor: Input 컴포넌트 font-size theme 적용 및 값 수정 * [FE]Feat/#35 토픽 목록 및 핀 목록 페이지 구현 (#60) * feat: 토픽 카드 컴포넌트 구현 * feat: 토픽 목록 페이지 구현 * refactor: 공통 컴포넌트 속성 수정 * feat: 핀 목록 페이지 구현 * [FE]Refactor#61 페이지 컴포넌트 머지 후 싱크 작업 (#62) * refactor: 페이지 컴포넌트 명 수정 (Topics -> Pins) * refactor: 이모지 오타 수정 * fix: key props 에러 해결 * remove: 스토리북 기본 asset 파일 삭제 * refactor: 스타일드 컴포넌트 CSS 카멜 케이스 prop 에러 해결 * rename: 컴포넌트 디렉토리 위치 변경 * design: 공통 컴포넌트에서 필요없는 속성 제거 * style: TODO 주석 추가 * feat: 페이지 컴포넌트 Route 추가 * rename: 페이지 컴포넌트 및 컴포넌트 명 변경 * [FE]Feat/#64 라우터 지정 및 상태 관리 (#66) * refactor: RouterProvider 정의 및 라우팅 관심사 분리 추가로 index.tsx에 React.StrictMode를 추가한다. * feat: 토픽 카드를 클릭하면 SelectedTopic 페이지로 이동하는 라우팅 기능 추가 * refactor: 버튼 명 변경 (TopicCardButton -> MultiSelectButton) * refactor(Button): as 키워드 대신 타입 명시 변환 * feat(Home): 토픽 추가하기 버튼을 누르면 토픽 추가 페이지로 이동하는 기능 추가 * feat: 사용자가 입력한 토픽 정보를 POST 하고 토픽 선택 페이지로 이동 하는 기능 추가 * style(NewTopic): 스타일 컴포넌트 로직 하단으로 배치 * refactor: Box 컴포넌트 cursor 속성 추가 * feat: 토픽 및 핀 타입 추가 * refactor: 토픽 다중 선택 버튼 수정 및 토픽 클릭 범위 수정 * feat: 핀 추가버튼을 눌렀을 때 핀 추가 페이지로 이동하는 기능 추가 * refactor: Layout 스크롤 가능토록 변경 * feat: 사이드바 확장하여 PinDetail 표시하는 기능 추가 * refactor: 개행 및 불필요한 console.log 제거, catch문 리팩토링 * feat: Logo 컴포넌트 추가 * rename: Layout 디렉토리 위치 변경 * refactor: PinPreview에 cursor pointer 효과 추가 * [FE]Feat/#65 MSW get, post 및 Api 구현 (#67) * feat: msw 토픽 목록 조회 기능 구현 * feat: msw 토픽 디테일 보기 기능 구현 * feat: msw 토픽 생성 기능 구현 * feat: msw 핀 생성 기능 구현 * [BE} 핀 관련 기능 구현 완료 (테스트 제외) #63 (#68) * chore: 초기 환경 설정 * feat: 토픽, 핀에 대한 Entity 및 뼈대코드 작성 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Getter 추가 및, Coordinate BaseEntity 상속 제거 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: 외래키에 Not Null 조건 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * feat: Repository 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * chore: gradlew 업데이트 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Entity 구조 변경 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Builder 패턴 추가 Co-authored-by: cpot5620 <[email protected]> * refactor: BigDecimal 소수점 범위 변경 Co-authored-by: cpot5620 <[email protected]> * feat: 범위 내 핀 조회 기능 구현 Co-authored-by: cpot5620 <[email protected]> * refactor: Entity 구조 변경 Co-authored-by: cpot5620 <[email protected]> * feat: 좌표간의 거리 계산 기능 구현 Co-authored-by: cpot5620 <[email protected]> * refactor: 생성자 파라미터 변경 Co-authored-by: cpot5620 <[email protected]> * feat: 핀 생성 서비스 구현 [#41] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 생성 API 구현 [#41] Co-authored-by: cpot5620 <[email protected]> * refactor: 좌표간의 거리 계산 로직 변경 Co-authored-by: cpot5620 <[email protected]> * feat: 핀 수정 서비스 구현 [#42] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 수정 API 구현 [#42] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 삭제 서비스 구현 [#43] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 삭제 API 구현 [#43] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 목록 조회 서비스 구현 [#38] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 목록 조회 API 구현 [#38] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 상세 조회 서비스 구현 [#40] Co-authored-by: cpot5620 <[email protected]> * feat: 핀 상세 조회 API 구현 [#40] Co-authored-by: cpot5620 <[email protected]> * fix: 핀 삭제 로직 오류 수정 [#43] Co-authored-by: cpot5620 <[email protected]> * rename: PinRepositoryTest -> LocationRepositoryTest Co-authored-by: cpot5620 <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * [BE] 토픽 관련 기능 구현 (#69) * feat: 새로운 토픽 생성 기능 구현 Co-authored-by: yoondgu <[email protected]> * feat: 토픽 병합 기능 구현 Co-authored-by: yoondgu <[email protected]> * refactor: Location, Pin 불필요한 테이블 분리 병합 Co-authored-by: yoondgu <[email protected]> * feat: Topic 수정 및 삭제 기능 구현 Co-authored-by: yoondgu <[email protected]> * feat: Topic 목록 조회 및 상세 조회 기능 구현 Co-authored-by: yoondgu <[email protected]> * feat: Coordinate의 위,경도가 대한민국 내에 있는 지 검증 기능 구현 Co-authored-by: yoondgu <[email protected]> * feat: Coordinate의 위,경도가 대한민국 내에 있는 지 검증 기능 구현 Co-authored-by: yoondgu <[email protected]> * refactor: 핀 생성 및 복제 시 연관관계 편의 메서드 사용 Co-authored-by: yoondgu <[email protected]> * test: 테스트 데이터 추가 및 테스트 코드 리팩터링 Co-authored-by: yoondgu <[email protected]> * style: 코드 컨벤션 통일을 위한 final 키워드 삭제 Co-authored-by: yoondgu <[email protected]> * refactor: 토픽 삭제 soft delete로 변경 Co-authored-by: yoondgu <[email protected]> * chore: DB 환경설정 파일 변경 - SpringBoot 버전 이슈로 인한 data.sql 실행 오류 발생 - 이에 대한 환경 설정 파일 변경 Co-authored-by: yoondgu <[email protected]> * refactor: 토픽에 대한 모든 핀 삭제 기능 변경 - 쿼리 실행 성능 개선을 위해 JPQL 적용 Co-authored-by: yoondgu <[email protected]> * refactor: 코드 컨벤션 정리 및 테스트 케이스 리팩터 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: kpeel5839 <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: kpeel5839 <[email protected]> * [FE]Refactor/#70 MSW 및 기능 머지 후 싱크 작업 (#71) * refactor: 토픽 카드 Props 명 수정 및 Type 분리 * fix: 새로운 토픽 생성 시 navigate 오류 해결 * refactor: 오타 일괄 수정 * style: 들여쓰기 및 공백 수정 * refactor: 핀 추가 시 쿼리스트링 수정 * refactor: NewPin 컴포넌트 라우터 설정 및 이벤트 핸들러 수정 * refactor: 목 데이터를 JSON에서 자바스크립트 형식으로 변경 * refactor: 사용자가 입력한 값으로 토픽 생성하도록 변경 * style: trailing comma 설정 문제 해결 * refactor: 사용자가 입력한 값으로 핀을 추가하도록 변경 * refactor: PinType updatedAt 속성 추가 * refactor: 핀 ID에 맞게 PinDetail 페이지를 출력하도록 수정 * refactor: MockData 추가 및 핸들러 로직 일부 수정 * test: 공통 컴포넌트 스토리북 구현 (#73) * [BE] 현재 위치 인기 토픽 조회 기능 구현 (#74) * feat: Topic validate 추가 Co-authored-by: yoondgu <[email protected]> * feat: Topic soft Delete 기능 구현 Co-authored-by: yoondgu <[email protected]> * feat: Topic 및 TopicCommandService validation 추가 Co-authored-by: yoondgu <[email protected]> * feat: 현재 위치 인기 토픽 조회 기능 구현 Co-authored-by: yoondgu <[email protected]> * test: 테스트 data.sql 대신 픽스쳐 사용으로 변경 - 쉬운 테스트 격리를 위한 픽스쳐 적용 Co-authored-by: junpakPark <[email protected]> * test: data.sql 파일명 변경으로 도메인 간 테스트 격리 Co-authored-by: junpakPark <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> Co-authored-by: yoondgu <[email protected]> * [BE] 핀 기능 관련 테스트 구현 (#75) * chore: 초기 환경 설정 * feat: 토픽, 핀에 대한 Entity 및 뼈대코드 작성 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Getter 추가 및, Coordinate BaseEntity 상속 제거 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: 외래키에 Not Null 조건 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * feat: Repository 추가 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * chore: gradlew 업데이트 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * refactor: Entity 구조 변경 Co-authored-by: yoondgu <[email protected]> Co-authored-by: cpot5620 <[email protected]> Co-authored-by: junpakPark <[email protected]> * test: PinRepository 테스트 구현 Co-authored-by: kpeel5839 <[email protected]> * refactor: 디미터 법칙 적용 Co-authored-by: kpeel5839 <[email protected]> * refactor: PinCreateRequest 변수 순서 변경 Co-authored-by: kpeel5839 <[email protected]> * test: PinService 핀 생성 테스트 구현 Co-authored-by: kpeel5839 <[email protected]> * test: PinService 핀 수정 및 삭제 테스트 구현 Co-authored-by: kpeel5839 <[email protected]> * refactor: 개행 조정 및 접근 제어자 조정 * test: 핀 목록 조회 서비스 기능 테스트 * test: 핀 단일 조회 서비스 테스트 * test: Pin Entity Validation 테스트 --------- Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: yoondgu <[email protected]> Co-authored-by: junpakPark <[email protected]> Co-authored-by: kpeel5839 <[email protected]> * chore: 불필요 파일 제거 * [FE]Feat/#77 핀 디테일 수정하기 페이지 구현 (#78) * feat: 핀 상세보기 수정 기능 구현 * fix: msw 에러 해결 * chore: msw 다운그레이드 적용 * refactor: PinDetail 수정하기 UI 변경 * Fix: emoji 아이콘 선택시 발생했던 에러 해결 * refactor: 불필요한 console 코드 삭제 --------- Co-authored-by: Patrick <[email protected]> * feat: cors를 위한 WebMvcConfig 구현 (#80) Co-authored-by: cpot5620 <[email protected]> * [BE] 핀 생성 요청 DTO 수정 (#93) * refactor: Coordinate 정적팩토리 메서드 추가 * refactor: PinCreateRequest 요청 타입 수정 * [BE] RestDocs API 문서화 (#91) * feat: rest docs 를 이용한 문서화 Co-authored-by: yoondgu <[email protected]> * feat: rest docs를 이용한 ControllerTest Co-authored-by: yoondgu <[email protected]> * docs: adoc toc 추가 및 문서 정렬 Co-authored-by: yoondgu <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> * refactor: PinCreateRequest 변경에 따른 테스트 코드 수정 (#94) * [BE] Controller RequestBody 누락으로 인한 코드 수정 (#96) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * fix: Controller RequestBody 추가 --------- Co-authored-by: 준팍(junpak) <[email protected]> * feat: 시맨틱 태그 적용 (#98) * [FE]Test/#102 공통 컴포넌트 이외의 컴포넌트 스토리북 코드 작성 (#103) * chore: 프로젝트 환경에 맞게 스토리북 세팅 * test: 공통 컴포넌트를 조합한 컴포넌트 스토리북 코드 작성 * test: 페이지 단위 스토리북 코드 작성 * [FE]Refactor/#104 스프린트 2 이후 전반적인 코드 리팩토링 (#105) * refactor: 검색창 input에 placeholder 추가 * refactor: overflow 속성을 scroll에서 auto로 변경 윈도우 OS 에서 scroll 속성은 내용이 overflow 되지 않아도 기본값으로 가로 및 세로에 모든 스크롤이 기본으로 생긴다. 맥 OS 에서 scroll 기본 값은 overflow 되었을 때만이다. 즉 OS간 보이는 화면이 다르므로 auto 속성으로 변경한다. * refactor: useNavigator hook 으로 분리 및 재사용 * design: 중복 태그 제거와 CSS 값 수정 및 잘못된 레이아웃 수정 * refactor: PinDetail 페이지에서 Update 관련 로직 분리 UpdatedPinDetail 페이지 컴포넌트로 분리한다. * refactor: 코드 컨벤션에 따라 이벤트 헨들러 메서드 명 수정 * refactor: form 제어 방식 변경 및 중복 코드 제거 onChangeInput 메서드 방식으로 일괄 수정한다. * refactor: 중복되는 타입을 타입 파일로 분리 * refactor: form 값 제어 중복 로직 useFormValues 훅으로 분리 * rename: useNavigator 잘못된 확장자 명 변경 * refactor: 가독성을 위한 변수명 수정 및 불필요한 로직 제거 * design: 디자인 시안과 다른 부분 수정 * feat: 깃허브 액션 설정 (#108) * [BE] API 명세 수정에 따른 Image 구현 (#110) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: Topic Image 추가 * refactor: Topic 에 Image 컬럼 추가로 인한 RestDocs 수정 * feat: PinImage 추가 * test: PinController 테스트 구현 (#101) * refactor: PinImage 추가에 따른 dto 수정 * test: 테스트 격리를 위한 sql 작성 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: jaeyeon kim <[email protected]> * [BE] 핀 관련 기능 코드 리팩토링 #90 (#106) * refactor: PinCreateRequest 변경에 따른 테스트 코드 수정 * refactor: Coordinate 매직 넘버 제거 및 메서드 분리(#84) * test: Coordinate 테스트 중첩 클래스 제거(#84) * style: LocationRepository 테스트 개행 수정 (#85) * style: Coordinate 개행 추가 (#84) * refactor: Pin 불필요한 `this` 키워드 제거 (#86) * refactor: PinService 주석 제거 및 메서드 분리 (#87) * refactor: PinController 변수 분리 (#88) * test: Pin 관련 테스트 개행 및 메서드 순서 변경 (#89) * refactor: 가독성을 위한 메서드명 변경 (duplicate -> copy) * refactor: 메서드명 변경 (From -> from) * refactor: 상수 접근 제어자 변경 * test: 좌표 거리 계산 테스트 ParameterizedTest 적용 * style: import * 제거 * test: 검증 테스트 메서드 명 수정 * chore: conflict 해결 * [BE] API 명세 수정에 따른 Image 구현 - 토픽 수정 관련 누락 보완 (#112) * remove: 사용하지 않는 토픽 수정 DTO 삭제 * feat: Topic 수정 로직 및 테스트에 image 필드 추가 반영 * feat: workflows CD 추가 (#120) * refactor: Location Header 접근 허용 설정 (#114) * [FE]Refactor/#109 수정된 API 명세 맞추기 및 백엔드와 연결 (#115) * refactor: 바뀐 api 명세로 코드 수정 * refactor: msw 연결을 백엔드와 연결하도록 코드 수정 * refactor: env파일 end of line 추가 * [BE] Github Action workflows CD refactoring (#122) * feat: workflows CD 추가 * refactor: 빌드 옵션 변경 및 주석 제거 * refactor: 빌드 결과물 파일명 변경 * refactor: 빌드 옵션 변경 (bootJar -> build) * refactor: worflows 파일 분리 (PR) * refactor: worflows 파일 분리 (CI/CD) * refactor: workflows CI/CD 동작 옵션 수정 * feat: 개발 서버 배포 자동화 쉘 스크립트 작성 (#130) * [BE] 개발서버 DB H2에서 MySQL로 이관 (#132) * feat: 개발 서버 구성 파일 작성 * feat: 개발 서버 구성 파일 DDL-auto 옵션 변경 * [FE] Feature/#116 토픽 및 핀 병합할 때 태그 추가되는 기능 구현 (#128) * feat: tag, 병합 및 같이보기 컴포넌트 생성 * feat: 토픽이나 핀 카드에서 버튼 클릭 시 태그 추가되거나 삭제되는 기능 구현 * refactor: tag가 없을 때 early return 하도록 수정 * refactor: tag의 padding값을 space 값으로 삽입 * refactor: selectedTopic에서 삼항연산자를 early return으로 변경 * refactor: early return 조건값 변경 * [FE] Feature/#129 토픽, 핀 병합 및 같이보기 기능 구현 (#137) * feat: tag, 병합 및 같이보기 컴포넌트 생성 * feat: 토픽이나 핀 카드에서 버튼 클릭 시 태그 추가되거나 삭제되는 기능 구현 * feat: 같이보기 및 병합 기능 구현 * feat: context api를 이용해 전역변수 사용 * refactor: api 명세에 맞게 type 변경 * refactor: navigator에 값을 보내도록 수정 * refactor: 서버와 통신하기 위해 base url을 서버 url로 변경 * [FE] 지도 UI 적용 (#138) * feat: tmap 지도 ui 추가 * feat: map 레이아웃 수정 및 에러 수정 * chore: tmap api 버전 변경 * chore: webpack 개발 환경 설정 변경 * refactor: Map 컴포넌트 렌더링 로직 변경 * feat: 토픽 클릭 시 지도 핀 변경 기능 구현 * refactor: context Api 적용 선택된 토픽 핀 표시 * feat: 선택한 토픽 기준으로 지도 표시 범위 이동 * feat: 특정 핀 클릭 이벤트 추가 * feat: 현재 클릭한 핀 애니메이션 적용 * feat: tag 표시 변경 * feat: 지도 클릭시 도로명 주소 가져오기 * feat: 핀 추가하기 페이지로 이동 시 애니메이션 제거 * refactor: 마커 애니메션 제거 로직 위치 변경 * feat: 선택한 좌표 핀 생성시 input에 적용 * feat: 현재 클릭된 마커 표시 기능 구현 * feat: daum post api 적용 * [FE]Refactor/#139 머지 후 싱크 및 에러 해결 작업 (#140) * feat: get fetch api 추가 및 적용 * refactor: 생략된 코드 추가 및 필요없는 코드 삭제 * [BE] 개발 및 운영 서버 구성 파일 및 CI/CD 설정 분리 (#135) * docs: merge workflow 개발서버 전용으로 변경 * �운영 서버 전용 merge workflow 작성.yml * docs: pull-request workflow 운영 브랜치에도 적용 * feat: 운영 서버 구성 파일 작성 * rename: 백엔드 CI/CD workflow 분리를 위한 파일명 변경 * refactor: 백엔드 workflow name 수정, 배포스크립트 경로 수정 - CI, CD workflow가 분리되어있으므로 name을 수정함 - 배포 스크립트 경로 프론트엔드와 백엔드 통일 * [�FE] 프론트엔드 Github Action workflows CD 추가 (#136) * feat: 프론트엔드 CI/CD workflow 파일 작성 * feat: 프론트엔드 CI/CD workflow 파일 수정 - 빌드 권한 부여 * refactor: Artifact 업로드 파일 수정 * refactor: 업로드 및 다운로드 파일 경로 수정 * refactor: 업로드 및 다운로드 파일 경로 수정 * rename: workflow name 수정 - 현재 테스트 실행하지 않으므로 CI/CD가 아닌 CD로 이름 변경 --------- Co-authored-by: zun <[email protected]> * [BE] Truncate 를 위한 DatabaseCleanup 구현 (#118) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * test : Database Truncate 위한 DatabaseCleanup 구현 * style : 코드 컨벤션으로 인한 개행 추가 * refactor : @Service -> @Component 및 guava 의존성 제거 * fix: guava import 문 제거 * refactor: 메서드, 변수 분리 * refactor: disable/enable Referential query 상수로 변환 --------- Co-authored-by: 준팍(junpak) <[email protected]> * feat: topicId 배열로 get 요청 시, 해당 토픽들 상세 조회 API 구현 (#142) * [FE]Refactor/#143 토픽 같이보기 기능 추가된 명세에 맞게 수정 및 context 코드 변경 (#144) * refactor: 필요없는 context api 삭제 * refactor: context 초기값 위치 변경 * refactor: 같이보기 기능 명세대로 get 요청 url 수정 * refactor: coordinate.id 타입 string으로 변경 * refactor: event에 element 추가 * refactor: 구조할당으로 변경 * refactor: 프론트 workflows 수정 (#146) * refactor: 토픽 카드에 이미지 적용 및 blur처리 (#148) * [FE] CI/CD workflows 코드 재수정 (#149) * refactor: 프론트 workflows 수정 * refactor: 프론트 workflows 수정(cache 적용) * Revert "refactor: 토픽 카드에 이미지 적용 및 blur처리 (#148)" (#150) This reverts commit a22bf36ecd1146975efb3c3d5c5ce929b5abe837. * Revert "[FE] CI/CD workflows 코드 재수정 (#149)" (#152) This reverts commit eadeac78e3c3741a2a6e4ec648bd8f13d026edbd. * Revert "[FE] CI/CD workflows 코드 재수정 (#149)" (#153) This reverts commit eadeac78e3c3741a2a6e4ec648bd8f13d026edbd. * refactor: 토픽 카드에 이미지 적용 및 blur처리 구현 (#154) * Revert "Revert "[FE] CI/CD workflows 코드 재수정 (#149)" (#153)" (#155) This reverts commit b26e127d194736c4e57cd435c14c6f263f79ff6e. * [FE] CICD 코드 working directory 수정 (#156) * refactor: 프론트 workflows 수정 * refactor: 프론트 workflows 수정(cache 적용) * refactor: 프론트 workflows 수정(working directory 수정) * Revert "refactor: 토픽 카드에 이미지 적용 및 blur처리 구현 (#154)" (#158) This reverts commit b3d4aed7fa8a8e7e86dddb6c9633aa62d6d664c2. * refactor: 토픽 카드 이미지 적용 및 blur 처리 구현 (#159) * [FE] CI/CD workflows 코드 수정 (#160) * refactor: 프론트 workflows 수정 * refactor: 프론트 workflows 수정(cache 적용) * refactor: 프론트 workflows 수정(working directory 수정) * refactor: 프론트 workflows 수정(npm 권한 삭제) * Revert "refactor: 토픽 카드 이미지 적용 및 blur 처리 구현 (#159)" (#162) This reverts commit ee755edb66365eca452da8b53c204a7d2b2c464f. * feat: 토픽 카드 이미지 적용 및 blur처리 구현 (#163) * Revert "feat: 토픽 카드 이미지 적용 및 blur처리 구현 (#163)" (#164) This reverts commit 34bd8a44f0df59eefaa3f1ef1ea3897a645454b6. * [FE] CI/CD workflows 코드 수정 (#165) * refactor: 프론트 workflows 수정 * refactor: 프론트 workflows 수정(cache 적용) * refactor: 프론트 workflows 수정(working directory 수정) * refactor: 프론트 workflows 수정(npm 권한 삭제) * refactor: 프론트 workflows 수정(브랜치 범위 변경) * refactor: 프론트 workflows 수정(배포 코드 수정) * refactor: 토픽 카드에 이미지 추가 및 blur 처리 구현 (#166) * fix: CORS 허용 Origin에 개발서버, 운영서버 도메인 추가 (#171) * fix: CORS 허용 여러 Origin 모두 설정하도록 수정 (#174) * [FE] Refactor/#168 전반적인 레이아웃 및 UI 오류 수정 (#179) * refactor: 피그마 시안과 맞지 않는 UI 수정 * refactor: 레이아웃 컴포넌트 오류 (width) 수정 , 스크롤 위치 수정 * refactor: PinPreview 체크 박스 클릭 이벤트 오류 수정 * refactor: 핀 링크 공유 버튼 클릭 시 alert 표시하기 * refactor: prettier 적용 * [FE]Refactor/#169 불필요한 코드, 컨텍스트 제거 (#178) * refactor: tagId Context 제거 후 Router state로 대체 * refactor: 불필요한 import 제거 * fix: li 태그 내부 li 태그 오류 수정 * [FE]Fix/#167 전반적인 지도 오류 수정 및 개선 (#181) * refactor: 선택된 마커 애니메이션 변경 * fix: 핀 클릭 시 중복 생성 에러 해결 * feat: 같이 보기 기능 각 토픽 별 마커 구분 기능 구현 * fix: 마커 변경 * [FE]Refactor/#145 UI 조정 및 머지 후 자잘한 오류 수정 (#183) * fix: 지도를 클릭하여 핀 추가 시 주소 정보가 입력되지 않던 오류 수정 * refactor: 핀 미리보기 상세내용을 3줄까지만 보여주고 ellipsis 하도록 변경 * refactor: PinDetail 페이지 및 PinPreview space 수정 * refactor: 전반적인 space 수정 및 임시 토픽 생성자명 수정 * refactor: 토픽카드 띠 어둡게 처리하여 가독성 개선 * design: 태그 컴포넌트 크기 및 글자크기 조정 * refactor: 확인 버튼 우측으로 이동 및 기본 이미지 삽입 * refactor: 핀 수정하기 페이지 저장 버튼 우측으로 이동 * feat: 각 첫 input 태그에 autoFocus 기능 추가 * refactor: 핀 주소 입력시 keyDown 이벤트를 감지하여 검색창 띄울 수 있도록 변경 * refactor: tabIndex 적용하여 우측 확인버튼 선택 편리성 고려 * refactor: 토픽 공유 기능 추가 및 불필요한 코드 제거 * refactor: 불필요한 import 제거 * refactor: 토픽 추가하기 버튼 포지션 조정 * refactor: 토픽 카드 그림자 추가 및 띠 투명도 조절 * rename: Tag 디렉토리 위치 변경 * refactor: 링크 복사 alert 메세지 수정 * design: 불필요한 코드 제거 * design: 피그마 시안과 맞지 않는 부분 수정 * fix: 같이보기 취소 시에 체크 박스가 해제되지 않던 오류 수정 * refactor: 사용하지 않는 함수 제거 및 멘트 수정 * design: 누락된 height 값 추가 및 클릭 영역 확대 * design: 대체 이미지 기능 구현 및 여백 수정 * [FE]Refactor/#186 map api 리팩토링 (#187) * refactor: 맵 클릭 이벤트 분리 * refactor: 클릭한 위치 관련 관심사 분리 * refactor: 마커 업데이트 로직 관심사 분리 * refactor: 불필요한 의존성 제거 * refactor: 지도 위 마커 적용 로직 분리 * refactor: 도로명 주소 가져오는 로직 분리 * refactor: 불필요한 코드 제거 * feat: pin 이미지 변경 * fix: 초기 핀 생성 에러 수정 * refactor: 보여지는 마커 변경하는 로직 수정 * refactor: 핀 클릭 시 로직 수정 * Merge branch 'develop' of https://github.com/woowacourse-teams/2023-map-befine into refactor/map-api * feat: 토픽 같이 보기 기능 웹 접근성 개선 (#188) * refactor: 핀 관련 에러 수정 (#190) * fix: 같이보기 상태에서 핀 추가시 발생하는 오류 수정 (#192) 1. 토픽이 undefined로 잡히던 오류를 수정한다. 2. 토픽이 오름차순으로 정렬되어 체크박스로 선택한 순서와 화면에 보이는 토픽의 순서가 다른 문제를 해결한다. 3. 핀을 추가한 후에 해당 핀 페이지로 이동하던 오류를 수정한다. 따라서 이전의 같이보기 페이지로 이동한다. * fix: 같이 보기에서 핀 클릭 시 같이 보기가 풀리는 오류 수정 (#193) * fix: 핀 색깔 마지막 타입 에러 수정 (#195) * refactor: 줌 레벨 및 애니메이션 수정 (#197) * [FE]Test/#185 useFormValues 커스텀 훅 테스트 (#198) * chore: testing library 세팅 초기화 (임시) * chore: testing library 세팅 완료 * test: useFormValues 훅 테스트 * test: 불필요한 테스트 코드 제거 * chore: 잘못된 의존성 설치 수정 * [FE]Feature/#184 웹 접근성 개선 (#199) * feat: 웹 접근성 input enter 추가 * refactor: 웹 접근성 적용 안된 부분 적용 * refactor: 토픽 인기 목록에 tab index 추가 * [FE]Feature/#205 Toast 컴포넌트 구현 및 기존 alert 대체 (#206) * feat: Toast 컴포넌트 구현 및 기존 alert 대체 * feat: 토픽 생성, 병합 또는 핀 생성, 뽑아오기 시 토스트 알림 적용 * refactor: 사용하지 않는 변수 _ 처리 * refactor: React. 대신 구조분해 할당으로 import * [FE]Refactor/#207 전반적인 코드 리팩토링 및 추상화 (#208) * rename: api 관련 디렉토리 폴더명 변경 * rename: 상수 폴더명 변경 (const -> constants) * refactor: getApi 중복 로직 제거 및 적용 * refactor: Text 컴포넌트 불필요한 interface 제거 * refactor: Input 컴포넌트 불필요한 속성 제거 및 GlobalStyles로 분리 * style: Textarea 컴포넌트 고정 속성 상위 배치 * style: Button 컴포넌트 고정 속성 상위 배치 * style: Flex 컴포넌트 스타일 선언 방식 일괄 수정 * refactor: Box 컴포넌트 불필요한 interface 제거 및 Image 컴포넌트로 분리 이미지와 관련된 로직은 Image 컴포넌트로 위임한다. * refactor: 잘못된 type 선언 방식 수정 (type -> interface) * refactor: Tag 컴포넌트 리액트 컴포넌트로 변경 * rename: Map 컴포넌트 디렉토리 변경 * refactor: Tag 컴포넌트에 tabIndex 속성 부여 * refactor: isCollapsed DOM 에러 대응 * refactor: 잘못된 스타일드 컴포넌트 명 수정 * design: pinDetail 스크롤 기능 추가 * refactor: Space 컴포넌트가 부모 크기에 의해 사이즈가 변경되는 오류 수정 * [BE] Location 패키지 코드 리팩터링 (#182) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: member 구현 중 Co-authored-by: jaeyeon kim <[email protected]> * feat: 패키지 분리, AuthMember 구현 Co-authored-by: jaeyeon kim <[email protected]> * feat: MemberArgumentResolver 구현 * feat: AuthTopic 구현 * refactor: API 명세 수정을 위한 임의 커밋 Co-authored-by: jaeyeon kim <[email protected]> * feat: Publicity, Permission 정적 팩토리 및 Converter 추가 * refactor: Topic 에 Publicity, Permission 추가로 인한 테스트 수정 * refactor: 모든 테스트가 통과하도록 수정 * refactor: 모든 테스트가 통과하도록 수정 * feat: Topic 에 관한 CRUD 에 권한 적용 완료 * fix: Converter 반환값 이상으로 인한 오류 해결 * feat: Pin 기능에 권한 설정 추가 * style: 사용하지 않는 import 문 제거 및 접근 제어자 조정 * refactor: .. 지송;;^^ - 패키지 재분배 - AUTH 관련 기능 구현 - TopicController 및 LocationController 분리 Co-authored-by: jaeyeon kim <[email protected]> * refactor: TopicStatus 로직 오류 수정 LocationController 오타 수정 * refactor: 불필요 상수 제거 * refactor: PinResponse 자료형 변경 * feat: Image 클래스 구현 * feat: LocationRepository에 하버사인을 이용한 find 메서드 구현 * refactor: LocationController의 메서드명 변경 * refactor: getTopicsWithPermission의 반환값 변경 * style: 불필요 공백 제거 * refactor: 로직 오류 수정 및 테스트 추가 * test: Topic 패키지 테스트 추가 * refactor: Auth 관련 리팩터링 및 TopicIntegrationTest * refactor: auth 어노테이션 제거 * test: AddressTest 추가 * test: Pin 관련 테스트 추가 * refactor: Coordinate BigDecimal -> Double 로 수정 * refactor: 모든 테스트가 성공하도록 수정 * refactor: LocationRepositoryTest 수정 * refactor: 핀 위치 중복 처리 조회 쿼리 변경 * test: Address 테스트 추가 * refactor: Coordinate 불필요 상수 정리 및 테스트 추가 * refactor: Location 불필요 메서드 정리 및 테스트 추가 * refactor: LocationRepository 불필요 메서드 정리 및 테스트 코드 리팩터링 * refactor: LocationQueryService 메서드 네이밍 수정 및 상수 추가 * test: LocationFixture 작성 및 적용 * refactor: LocationQueryService 및 테스트 리팩터링 * refactor: AuthTopic 객체 제거 * refactor: 오타 수정 및 불필요 메서드 제거 * refactor: git conflict 해결 * style: 불필요 공백 및 import 구문 삭제 * refactor: RestDocs를 위한 Interceptor 조건문 추가 * test: LocationControllerTest 추가 * test: LocationIntegrationTest 추가 * chore: 패키지 네이밍 오타 수정 * refactor: 상수화 및 메서드 분리 * refactor: 불필요 메서드 삭제 * style: 컨벤션 준수 * refactor: URI의 자원 표기 복수형으로 수정 및 불필요 상수 제거 * style: 네이밍 변경 및 공백 추가 * test: authHeader 생성 로직 수정 * refactor: requestBody를 requestParam으로 수정 및 컨벤션 통일 --------- Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: yoondgu <[email protected]> * refactor: 지도 버전을 변경한다. (#242) * [FE] Refactor/#241 PinDetail 페이지 UI 및 관련 로직 수정, 공용 모달 구현 (#244) * feat: 공용 모달 context 생성 * feat: PinDetail UI 변경 및 모달 추가 * refactor: ModalPortal props 이름 변경 * refactor: 수정하기 기능 수정하기 버튼에 적용 * [FE] Refactor/#245 하단 바 및 선택된 토픽 UI 수정 (#246) * feat: 하단 바 구현 * feat: 바뀐 UI 적용 * refactor: 하단 바 색깔 변경 * [FE]Feature/#236 홈 UI 재배치 및 같이보기 페이지 구현 (#243) * design: 스프린트 4 피그마 시안에 맞게 UI 배치 변경 * refactor: 컴포넌트 레이어 분리 * refactor: 컴포넌트 명을 파일 명과 동일시 변경 * feat: Layout Width 컨텍스트 생성 및 적용 * refactor: 사이드바 확장 기능 보류 (관심사 분리 차원) * feat: TopicCard 컴포넌트의 형태를 두 가지로 구현 * feat: 주제와 관련된 토픽 별로 전체보기 기능 추가 * fix: horizontal router 기능 누락 및 오류 수정 * feat: 모아 보기 기능 및 버튼 추가 * refactor: 토픽 모양을 결정하는 prop명 변경 * refactor: 모아보기 컴포넌트 버튼으로 변경 및 위치 조정 * feat: 각 토픽 컨테이너의 설명문 추가 * fix: 머지 과정에서 누락된 import 추가 (#247) * [BE] Member 관련 기능 개발 (#237) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: member 구현 중 Co-authored-by: jaeyeon kim <[email protected]> * feat: 패키지 분리, AuthMember 구현 Co-authored-by: jaeyeon kim <[email protected]> * feat: MemberArgumentResolver 구현 * feat: AuthTopic 구현 * refactor: API 명세 수정을 위한 임의 커밋 Co-authored-by: jaeyeon kim <[email protected]> * feat: Publicity, Permission 정적 팩토리 및 Converter 추가 * refactor: Topic 에 Publicity, Permission 추가로 인한 테스트 수정 * refactor: 모든 테스트가 통과하도록 수정 * refactor: 모든 테스트가 통과하도록 수정 * feat: Topic 에 관한 CRUD 에 권한 적용 완료 * fix: Converter 반환값 이상으로 인한 오류 해결 * feat: Pin 기능에 권한 설정 추가 * style: 사용하지 않는 import 문 제거 및 접근 제어자 조정 * refactor: .. 지송;;^^ - 패키지 재분배 - AUTH 관련 기능 구현 - TopicController 및 LocationController 분리 Co-authored-by: jaeyeon kim <[email protected]> * refactor: TopicStatus 로직 오류 수정 LocationController 오타 수정 * refactor: 불필요 상수 제거 * refactor: PinResponse 자료형 변경 * feat: Image 클래스 구현 * feat: LocationRepository에 하버사인을 이용한 find 메서드 구현 * refactor: LocationController의 메서드명 변경 * refactor: getTopicsWithPermission의 반환값 변경 * style: 불필요 공백 제거 * refactor: 로직 오류 수정 및 테스트 추가 * test: Topic 패키지 테스트 추가 * refactor: Auth 관련 리팩터링 및 TopicIntegrationTest * refactor: auth 어노테이션 제거 * test: AddressTest 추가 * test: Pin 관련 테스트 추가 * refactor: Coordinate BigDecimal -> Double 로 수정 * refactor: 모든 테스트가 성공하도록 수정 * refactor: LocationRepositoryTest 수정 * feat: 멤버 단일 조회 기능 추가 * feat: 멤버 목록 조회 기능 구현 * feat : Member 를 Create 하는 기능 추가 * feat : Member 가 만든 Topic 들을 조회하는 기능 추가 * feat : Member 가 본인이 만든 Pin 을 조회하는 기능 추가 * feat : 토픽을 생성한 자가 특정 멤버에게 권한을 주는 기능 추가 * feat : 토픽을 생성한자가 특정 멤버의 권한을 삭제하는 기능 추가 * feat : 해당 토픽에 권한을 가진 모든 유저를 조회 * feat : 권한을 가진 유저를 ID 로 조회하는 기능 추가 * refactor: AuthTopic 객체 제거 * feat : Topic, Pin, Member 에 연관관계 편의 메서드 추가 * refactor: RestDocs를 위한 Interceptor 조건문 추가 * test : Permission 추가와 관련된 Domain Test 작성 * test : 다른 유저에게 권한을 주는 기능 테스트 추가 * test : 권한 부여 인수테스트 추가 * docs : 권한 부여 API 명세 작성 * test : 권한 삭제 Service Test 작성 * test : 권한 삭제 인수테스트 작성 * docs : 권한 삭제 API 명세 작성 * test : memberResponse 정적 팩토리 메서드 테스트 작성 * test : 권한이 있는 멤버 전체를 조회하는 기능 Service Test 작성 * test : 해당 토픽에 권한을 가진 자들을 모두 조회하는 기능 인수테스트 작성 * docs : 해당 토픽에 권한을 가진 유저의 목록을 조회하는 API 명세 작성 * test : MemberDetailResponse 생성 테스트 추가 * test : 권한을 가진 유저를 조회하는 기능 Service Test 추가 * test : 권한을 가진 유저를 조회하는 기능 인수테스트 추가 * docs : 권한을 가진 유저를 조회하는 기능 API 명세 추가 * test : 유저를 저장하는 기능 Service Test 작성 * test : 유저를 저장하는 기능 인수테스트 작성 * docs : 유저를 저장하는 기능 API 명세 작성 * test : 유저를 목록 조회하는 기능 Service Test 작성 * test : 유저를 목록 조회하는 기능 인수테스트 작성 * docs : 유저를 목록 조회하는 기능 API 명세 작성 * refactor : AuthInterceptor mocking 을 RestDocs 에서 실행 * test : 유저 단일 조회 Service Test 작성 * test : 유저 단일 조회 인수테스트 작성 * docs : 유저 단일 조회 API 명세 작성 * test : 유저가 만든 토픽, 핀 조회 Service Test 작성 * test : 유저가 만든 토픽, 핀 조회 인수테스트 작성 * docs : 유저가 만든 토픽, 핀 조회 API 명세 작성 * refactor : MemberInfoTest Role 검증 수정 * refactor : MemberTest 수정 * refactor : ServiceTest 내에서 데이터 준비과정을 Repository 로만 하도록 수정 * refactor : Integeration 테스트에서도 Repository 를 통해 데이터를 준비할 수 있도록 수정 * style : 개행 및 사용하지 않는 import 문 제거 * refactor : 권한 조회시 권한에 대한 ID 값도 반환할 수 있도록 수정 * fix : ignoringFields 에 createdAt, updatedAt 추가 * fix : github action test 에서 깨지는 테스트 수정 * refactor : MemberDetailResponse updateAt -> updatedAt 로 수정 * refactor : Member name -> nickName 으로 수정 * style : 개행 수정 * refactor : Objects.isNull 을 사용하여 null 을 검사하도록 통일 및 Repository 매개변수 수정 * refactor : 부정 조건문 수정 * refactor : MemberInfo Update 삭제 * style : 개행 조정 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: junpakPark <[email protected]> * [FE]Refactor/#248 지도 버전 변경 반영 (#249) * fix: 마커 이벤트 추가 * fix : 지도 검색 팝업 갯수 제한 * fix: 클릭 시 위경도 미출력 에러 해결 * [BE] 핀(Pin) 패키지 코드 리팩터링(PinImage 기능 구현 포함) (#240) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: member 구현 중 Co-authored-by: jaeyeon kim <[email protected]> * feat: 패키지 분리, AuthMember 구현 Co-authored-by: jaeyeon kim <[email protected]> * feat: MemberArgumentResolver 구현 * feat: AuthTopic 구현 * refactor: API 명세 수정을 위한 임의 커밋 Co-authored-by: jaeyeon kim <[email protected]> * feat: Publicity, Permission 정적 팩토리 및 Converter 추가 * refactor: Topic 에 Publicity, Permission 추가로 인한 테스트 수정 * refactor: 모든 테스트가 통과하도록 수정 * refactor: 모든 테스트가 통과하도록 수정 * feat: Topic 에 관한 CRUD 에 권한 적용 완료 * fix: Converter 반환값 이상으로 인한 오류 해결 * feat: Pin 기능에 권한 설정 추가 * style: 사용하지 않는 import 문 제거 및 접근 제어자 조정 * refactor: .. 지송;;^^ - 패키지 재분배 - AUTH 관련 기능 구현 - TopicController 및 LocationController 분리 Co-authored-by: jaeyeon kim <[email protected]> * refactor: TopicStatus 로직 오류 수정 LocationController 오타 수정 * refactor: 불필요 상수 제거 * refactor: PinResponse 자료형 변경 * feat: Image 클래스 구현 * feat: LocationRepository에 하버사인을 이용한 find 메서드 구현 * refactor: LocationController의 메서드명 변경 * refactor: getTopicsWithPermission의 반환값 변경 * style: 불필요 공백 제거 * refactor: 로직 오류 수정 및 테스트 추가 * test: Topic 패키지 테스트 추가 * refactor: Auth 관련 리팩터링 및 TopicIntegrationTest * refactor: auth 어노테이션 제거 * test: AddressTest 추가 * test: Pin 관련 테스트 추가 * refactor: Coordinate BigDecimal -> Double 로 수정 * refactor: 모든 테스트가 성공하도록 수정 * refactor: LocationRepositoryTest 수정 * feat: 멤버 단일 조회 기능 추가 * feat: 멤버 목록 조회 기능 구현 * feat : Member 를 Create 하는 기능 추가 * feat : Member 가 만든 Topic 들을 조회하는 기능 추가 * feat : Member 가 본인이 만든 Pin 을 조회하는 기능 추가 * feat : 토픽을 생성한 자가 특정 멤버에게 권한을 주는 기능 추가 * feat : 토픽을 생성한자가 특정 멤버의 권한을 삭제하는 기능 추가 * feat : 해당 토픽에 권한을 가진 모든 유저를 조회 * feat : 권한을 가진 유저를 ID 로 조회하는 기능 추가 * refactor: AuthTopic 객체 제거 * chore: AuthToic 변경 사항 반영을 위한 merge * chore: AuthToic 변경 사항 반영을 위한 merge 추가 * refactor: Pin 예외 메시지 수정 - #127 과 내용 통일 * chore: AuthToic 변경 사항 반영을 위한 merge 추가 * feat : Topic, Pin, Member 에 연관관계 편의 메서드 추가 * refactor: RestDocs를 위한 Interceptor 조건문 추가 * refactor: 핀 조회 관련 API 문서화에 인증 헤더 추가 * test : Permission 추가와 관련된 Domain Test 작성 * test : 다른 유저에게 권한을 주는 기능 테스트 추가 * test : 권한 부여 인수테스트 추가 * docs : 권한 부여 API 명세 작성 * test : 권한 삭제 Service Test 작성 * test : 권한 삭제 인수테스트 작성 * docs : 권한 삭제 API 명세 작성 * test : memberResponse 정적 팩토리 메서드 테스트 작성 * test : 권한이 있는 멤버 전체를 조회하는 기능 Service Test 작성 * test : 해당 토픽에 권한을 가진 자들을 모두 조회하는 기능 인수테스트 작성 * docs : 해당 토픽에 권한을 가진 유저의 목록을 조회하는 API 명세 작성 * test : MemberDetailResponse 생성 테스트 추가 * test : 권한을 가진 유저를 조회하는 기능 Service Test 추가 * test : 권한을 가진 유저를 조회하는 기능 인수테스트 추가 * docs : 권한을 가진 유저를 조회하는 기능 API 명세 추가 * test : 유저를 저장하는 기능 Service Test 작성 * test : 유저를 저장하는 기능 인수테스트 작성 * docs : 유저를 저장하는 기능 API 명세 작성 * test : 유저를 목록 조회하는 기능 Service Test 작성 * test : 유저를 목록 조회하는 기능 인수테스트 작성 * docs : 유저를 목록 조회하는 기능 API 명세 작성 * refactor : AuthInterceptor mocking 을 RestDocs 에서 실행 * test : 유저 단일 조회 Service Test 작성 * test : 유저 단일 조회 인수테스트 작성 * docs : 유저 단일 조회 API 명세 작성 * test : 유저가 만든 토픽, 핀 조회 Service Test 작성 * test : 유저가 만든 토픽, 핀 조회 인수테스트 작성 * docs : 유저가 만든 토픽, 핀 조회 API 명세 작성 * refactor: Pin 생성 시 PinInfo를 묶어서 받도록 수정, 중복 테스트 제거 - PinInfo의 필드인 name, description을 직접 받는 대신 PinInfo를 받도록 함. - PinInfo의 필드가 추가될 경우에 Pin의 생성자도 수정할 필요가 없도록 함. - PinTest에서 PinInfoTest와 중복되는 테스트 제거 - PinInfo 업데이트 시 새 객체 할당하도록 하여 검증이 필요한 로직 최소화 (update 관련 테스트 삭제) * refactor: Pin 생성 시 권한 예외처리 추가 * test: 테스트 코드 컨벤션 통일, 도메인 계층 간 테스트 내용 분리, fixture 사용 * refactor: PinImage 생성 시 Image 객체를 전달받도록 수정, getter 추가 - Pin 리팩터링과 마찬가지로, Image의 필드 추가 시에도 생성 메서드 시그니처 변경할 필요 없도록 함. - imageUrl에 어떤 검증 로직이 있는지 명시적으로 보여줄 수 있음. * refactor: 회원 조회 로직 권한 확인 후 수행하도록 변경, 상수 처리 * test: 테스트 클래스 내 픽스쳐 사용 방식 통일, 메서드 순서 변경 * test: Pin copy 테스트 추가 * test: Pin 통합테스트 request 객체 멤버변수로 관리 * feat: PinImage 추가 API 작성, 기존 Pin 생성 및 수정 명세 변경 * test: 중복되는 내용의 PinCommandServiceTest 테스트 삭제 - 하위 계층에서 테스트하는 내용에 대해 테스트하는 메서드 삭제 * feat: 핀 삭제 시 핀 이미지 삭제 구현 * test: 핀 삭제 테스트에서 핀 이미지도 삭제되는지 확인하도록 수정 * refactor: 핀 이미지 추가 시 location 응답헤더 반환하도록 수정 * feat: 핀 이미지 삭제 기능 구현 * feat: 핀 상세 조회 시 이미지 id 반환하도록 수정 * docs: RestDocs 문서화 설정에 새 API 추가 * feat: 핀 복사 시 핀 이미지도 복사하도록 수정 * chore: 불필요한 주석 삭제, 코드 리뷰를 위한 주석 추가 * fix: updatedAt 관련 테스트 실패 해결 * refactor: 중복 거리 상수 단위 표기 * fix: 핀 이미지 삭제 메서드명 수정 * fix: 핀 이미지 관련 핸들러메서드에 LoginRequired 추가 * refactor: 사용하지 않는 Location 헤더값 전달 삭제 * feat: 핀 이미지 삭제 hard delete에서 soft delete으로 변경 * refactor: null 검증 메서드 통일 * test: Pin, PinImage RepositoryTest setUp 메서드 처리 * refactor: Pin 서비스 클래스 메서드 분리 - 조회 및 예외처리 로직 메서드 분리 - 검증 로직 메서드 분리 (TopicCommandService 와 분리 방식 통일) * test: Pin, PinImage RepositoryTest 픽스쳐 적용 * refactor: Pin 조회 서비스 메서드 네이밍 구체화 * refactor: PinQueryServiceTest 픽스쳐 적용 * refactor: Pin 변수명, 개행 수정 * fix: 864b851e 충돌 해결 시 주석 처리 실수 해제, 테스트 실패 해결 * refactor: PinCommandServiceTest 픽스쳐 적용, 테스트 단순화 * test: Pin 서비스 계층 권한 관련 테스트 작성 * refactor: 핀 이미지 제거 메서드명 구체화 * test: 불필요한 객체 생성 삭제 * refactor: 정적 팩터리 메서드 내부에서 객체 생성하도록 변경 - 정적 팩터리 메서드를 의미있게 사용하기 위함 - 다른 도메인에서의 코드와의 통일성을 위해 변경함 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: junpakPark <[email protected]> * [BE] Topic 패키지 관련 코드 리팩토링 (#238) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: member 구현 중 Co-authored-by: jaeyeon kim <[email protected]> * feat: 패키지 분리, AuthMember 구현 Co-authored-by: jaeyeon kim <[email protected]> * feat: MemberArgumentResolver 구현 * feat: AuthTopic 구현 * refactor: API 명세 수정을 위한 임의 커밋 Co-authored-by: jaeyeon kim <[email protected]> * feat: Publicity, Permission 정적 팩토리 및 Converter 추가 * refactor: Topic 에 Publicity, Permission 추가로 인한 테스트 수정 * refactor: 모든 테스트가 통과하도록 수정 * refactor: 모든 테스트가 통과하도록 수정 * feat: Topic 에 관한 CRUD 에 권한 적용 완료 * fix: Converter 반환값 이상으로 인한 오류 해결 * feat: Pin 기능에 권한 설정 추가 * style: 사용하지 않는 import 문 제거 및 접근 제어자 조정 * refactor: .. 지송;;^^ - 패키지 재분배 - AUTH 관련 기능 구현 - TopicController 및 LocationController 분리 Co-authored-by: jaeyeon kim <[email protected]> * refactor: TopicStatus 로직 오류 수정 LocationController 오타 수정 * refactor: 불필요 상수 제거 * refactor: PinResponse 자료형 변경 * feat: Image 클래스 구현 * feat: LocationRepository에 하버사인을 이용한 find 메서드 구현 * refactor: LocationController의 메서드명 변경 * refactor: getTopicsWithPermission의 반환값 변경 * style: 불필요 공백 제거 * refactor: 로직 오류 수정 및 테스트 추가 * test: Topic 패키지 테스트 추가 * refactor: Auth 관련 리팩터링 및 TopicIntegrationTest * refactor: auth 어노테이션 제거 * test: AddressTest 추가 * test: Pin 관련 테스트 추가 * refactor: Coordinate BigDecimal -> Double 로 수정 * refactor: 모든 테스트가 성공하도록 수정 * refactor: LocationRepositoryTest 수정 * refactor: AuthTopic 객체 제거 * refactor: RestDocs를 위한 Interceptor 조건문 추가 * refactor: DTO 변수 타입 수정 (primitive -> wrapper) * refactor: Image 정적 팩토리 메서드 명 변경 (of -> from) * refactor: Image 검증 메서드 부정 조건문 수정 * refactor: enum 클래스 변수명 변경 (title -> value) * refactor: Topic 메서드 내 변수 분리 * refactor: TopicInfo 검증 메서드 수정 * refactor: TopicQueryService 메서드 명 수정 * refactor: 토픽 생성 및 병합 메서드 분리 * refactor: Topic 조회시 검증 로직 추가 * test: TopicRepository soft-deleting 테스트 구현 * test: Topic 권한에 따른 조회 테스트 구현 * test: Topic 권한에 따른 생성 및 병합 수정 삭제 테스트 구현 * test: TopicController 다중 조회 및 핀 병합 테스트 구현 * refactor: 토픽 다중 조회 검증 로직 추가 * refactor: 예외 메세지 수정 및 null 검증 방식 수정 * refactor: 요청에 따른 토픽 생성 분기 시점 변경 * refactor: 토픽 권한 수정 메서드 추가 * refactor: TopicController 변수 명 통일 * style: 예외 메세지 오탈자 수정 * refactor: TopicInfo 불변 객체로 수정 * refactor: TopicStatus 검증 로직 추가 * style: 주석 제거 * refactor: 핀 복사 메서드 수정 * refactor: 핀 조회 메서드 분리 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: junpakPark <[email protected]> * [FE]Feature/#201 프론트 테스트 자동화 (#202) * feat: github action 추가 * refactor : 우분투 버전 변경 * [FE] Feature/#204 입력 폼 유효성 검사 (#256) * design: Input 및 Textarea 컴포넌트의 outline 속성 추가 * feat: 유효성 검사 로직 추가 욕설 및 비방어 데이터 셋은 추후 추가한다. * refactor: React DOM 에러 해결 및 옵셔널 부여 * feat: 유효성 검사 form 적용 및 input Container 분리 * refactor: 핀 주소 input 값이 채워져있을 때 입력창 모달을 띄우지 않도록 변경 * feat: maxLength 지정하여 최대 글자 수 제한하는 기능 추가 * refactor: 타입 명 일괄 수정 * feat: 빈 값 유효성 검사 추가 및 유효성 검사 로직 분리 * feat: 현재 입력 글자 수 및 최대 입력 글자 수 표시 * refactor: maxLength 가 넘어가면 입력이 불가하도록 변경 * design: 사용자 입력 값과 maxLength 표시 위치 이격 * fix: 주소를 수정하려고 input 태그를 눌렀을 때 입력창이 뜨지 않는 오류 수정 * refactor: 잘못된 placeholder 수정 * refactor: pinDetail Update 관련 컴포넌트에 유효성 검사 적용 * fix: pinDetail 수정 시 기존 에러 메세지 상태가 유지되는 오류 수정 * fix: 입력 모달창을 통해 주소값을 입력해도 유효성 검사에 걸리는 오류 수정 * refactor: 욕설 및 비방어 데이터셋 업데이트 * chore: github test 오류 수정 * [FE] feature/#266 이미지, 툴팁 공통 컴포넌트 구현 (#268) * feat: 이미지 컴포넌트 구현 * feat: 툴팁 컴포넌트 구현 * [BE] env/#272 CI/CD 테스트를 위한 환경변수 설정 추가 (#273) * chore: 테스트를 위한 환경변수 설정 추가 * chore: 테스트를 위한 환경변수 설정 추가, 배포 전에도 포함 * chore: workflow 간 step name 통일 * [FE] feature/#267 Suspense, ErrorBoundary, ErrorHandling 작업 구현 (#278) * chore: tsconfig 동적 임포트 수행을 위해 module esnext로 변경 * feat: topic 관련 suspense 구현 * refactor: selectedTopic 토픽과 핀 화면 컴포넌트로 따로 분리 * feat: 핀 suspense 구현 및 적용 * feat: 에러 바운더리 코드 작성 * feat: react router로 에러 처리 및 에러 페이지 구현 * refactor: 지도 맵 get api 분리 * fix: 지도에서 좌표 없는 곳 클릭 시 에러 해결 및 toast 메시지 출력 * refactor: error 처리 버튼 내용 변경 * refactor: skeleton 필요없는 타입 삭제 * [FE] feature/#259 로그인 버튼 구현 (관련 리다이렉트 설정), 토큰 관련 작업 (#281) * refactor: getApi 헤더 권한 옵션 추가 * feat: 카카오 로그인 기능 구현 * feat: 로그인 요청 페이지 구현 * feat: 에러 페이지 구현 * feat: 페이지별 권한 부여 * refactor: 하단 바 메뉴 변경 * refactor: 하단 바 메뉴 변경 및 로그인 버튼 클릭 기능 구현 * feat: 로그인 정보 로컬스토리지 저장 * feat: 새로운 지도 생성 페이지 권한 기능 추가 --------- Co-authored-by: ParkGeunCheol <[email protected]> * [BE] feature/#255 소셜로그인 구현 (#277) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat : Oauth 작업중 * feat: 소셜 로그인 및 회원가입 기능 구현 - 민감 정보 환경변수 관리가 아직 진행되지 않아 해당 상수 삭제 후 커밋 Co-authored-by: kpeel5839 <[email protected]> * feat: 사용자 인가를 위한 JWT 토큰 적용 Co-authored-by: kpeel5839 <[email protected]> * refactor : 소셜로그인 플랫폼 확장에 유연하도록 구조 리팩토링 * fix: Location 테스트 간 상수 공유로 인한 격리 문제 해결 * test: 소셜 로그인 적용, 인가 방식 변경으로 인한 테스트 코드 수정 - 소셜 로그인 적용으로 인해 생긴 OauthService를 다른 서비스 테스트에서는 Mock으로 주입함 - 인수 테스트에서 사용하는 AuthHeader 를 변경된 JWT 토큰 방식으로 적용함 * chore: 구성 파일에 인증 인가 관련 환경변수 작성 Co-authored-by: kpeel5839 <[email protected]> * refactor: 소셜 회원가입 시 닉네임 랜덤 생성하도록 변경, 관련 추상화 - KakaoMemberResponse 이전에 OauthServerType을 추상화한 OauthMember 계층 추가 - OauthMember에 필요한 정보만 받아와서, 새로 가입할 Member 객체 생성 - Member 객체 생성 시 닉네임 랜덤 생성 - 이를 통해 Service의 로직을 줄이면서 다른 소셜 로그인 타입에서도 똑같이 닉네임 랜덤 생성 가능하도록 함 - 이를 통해 member 패키지와의 참조 최소화 Co-authored-by: kpeel5839 <[email protected]> * rename: 클래스명 오기 수정 Co-authored-by: kpeel5839 <[email protected]> * rename: oauth 패키지 클래스 정리 - OauthServerTypeConverter common 패키지로 이동 - kakao 구현체, dto 패키지 분리 Co-authored-by: kpeel5839 <[email protected]> * rename: kakao oauth 관련 속성값 클래스명 변경 - 다른 Configuration 클래스들 이름과 겹쳐 혼동의 여지가 있어 수정함 Co-authored-by: kpeel5839 <[email protected]> * rename: 테스트 전용 authHeader 생성 클래스명 변경 Co-authored-by: kpeel5839 <[email protected]> * refactor: 테스트 전용 jwt secret key 환경변수 처리 Co-authored-by: kpeel5839 <[email protected]> * chore : cherry pick 으로 반여잉 되지 않는 사항들을 반영 * test : Kakao Redirect Url 반환을 테스트 * test : OauthService 의 Login 을 테스트 * docs : /oauth/{oauthServerType} API 명세서 작성 * docs : /oauth/login/{oauthServerType} API 명세서 작성 * test : 회원가입이 중복으로 일어나지 않음을 테스트 * chore : 패키지 분리 * docs : oauth.adoc 작성 및 다른 adoc 파일 경로 수정 * refactor : 재 로그인 테스트 보완 및 필요없는 검증 제거 * refactor: 불필요한 메서드 분리 제거 * refactor: stream 사용으로 인덴트 수정 * refactor: null 여부 확인 메서드 통일 * refactor: BearerAuthorizationExtractor 메서드 분리 * refactor : @ConfigurationPropertiesScan 위치 변경 * refactor : /oauth/{oauthServerType} 반환 코드 변경 * refactor : 테스트 실패 원인 파악 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: yoondgu <[email protected]> * [BE] refactor/#279 permission 패키지 분리 (#280) * refactor: Permission Enum 네이밍 변경(PermissionType) * refactor: MemberTopicPermission 네이밍 변경(Permission) 및 패키지 분리 * refactor: Service 및 Controller 분리 * test: 테스트 오류 수정 * refactor: 메서드 네임 수정 * docs: restDocs 추가 * refactor: 메서드 네이밍 변경 * refactor: 서버 주소 변경 (#284) * fix: https (#286) * fix: redirect-url (#287) * fix: get Code (#288) * fix/function-async (#289) * fix: routepage 제거 (#290) * [BE] feature/#264 토픽에 대한 즐겨찾기 API (#275) * feat: Bookmark Entity 구현 * feat: 즐겨찾기 추가 기능 구현 * feat: 즐겨찾기 추가 API 구현 * feat: 즐겨찾기 조회 API 구현 * test: 즐겨찾기 토픽 추가 및 조회 API 테스트 구현 * feat: 즐겨찾기 토픽 단일 및 전체 삭제 기능 구현 * test: 즐겨찾기 토픽 단일 및 전체 삭제 기능 테스트 구현 * feat: 즐겨찾기 토픽 단일 및 전체 삭제 API 구현 * test: 즐겨찾기 토픽 단일 및 전체 삭제 API 테스트 구현 * chore: Bookmark 패키지 분리 * refactor: 메서드 순서 변경 * test: 통합 테스트 @DisplayName 변경 * feat: 토픽에 대한 즐겨찾기 여부 반환 JPQL 구현 * feat: 토픽 조회시, 즐겨찾기 여부 반환 기능 구현 * test: 토픽 조회시, 즐겨찾기 여부 반환 테스트 구현 * style: 개행 수정 * refactor: 즐겨 찾기 삭제 로직 수정 * refactor: 즐겨 찾기 등록시, 검증 로직 추가 * refactor: TopicResponse 매개변수 통일 * refactor: 변수명 수정 * refactor: BookmarkResponse 삭제 * refactor: 사용하지 않는 변수 삭제 * style: restdocs 오탈자 수정 * fix: 데이터 로그 확인 (#291) * fix: url에 api 추가 (#292) * fix: data-shape (#293) * fix : seperate login (#295) * fix: login-error (#296) * [FE] Refactor/#269 reloaction UI (#276) * refactor: Space 컴포넌트 레이아웃간 여백 값 추가 * design: TopicCard UI 변경 * refactor: Home 레이아웃 재배치 및 확장 기능 추가 * design: TopicCard 핀 및 즐겨찾기 UI 여백 수정 * design: 피그마 시안에 따른 전체보기 UI 변경 * refactor: layout size를 변경하는 로직 커스텀 훅으로 분리 및 상수화 * refactor: 모바일 사이즈를 고려하여 sidebar 크기 조정 * refactor: navbar 위치 조정 및 선택 시 하이라이트 기능 추가 * refactor: 토픽 카드 디폴트 이미지 상수화 * design: 잘못된 속성 재배치 * refactor: 불필요한 svg 제거 및 topicInfo UI 재배치 * design: 핀 디테일 및 업데이트 관련 UI 재배치 * design: TopicInfo title size 수정 * fix: 핀 수정이 되지 않던 오류 수정 * refactor: 전체보기 각 항목마다 router 분리 url 공유 대응한다. * feat: 모아보기 페이지 추가 * feat: 즐겨찾기 페이지 추가 * feat: 마이페이지 추가 * refactor: 불필요한 console.log 제거 * fix: router 변경된 url 적용 * design: PinPreview 외 2 UI 재배치 * design: Tag 컴포넌트 다중 선택 일정개수 이상 시 '외' 형식으로 변경 * refactor: Div 모달 생성 및 context 적용 * refactor: 불필요한 import 제거 및 개행 처리 * refactor: Layout Width 값 별로 모달 위치 변경 가능토록 수정 * refactor: navbar 하이라이트 기능이 페이지 이동에 따라 변동되도록 변경 * fix: useEffect 의존성 배열 추가 안되어 발생한 오류 수정 * fix: layoutWidth DOM 에러 수정 * fix: dimmedColor DOM 에러 수정 * feat: NewPin 토픽 id가 없을 때 토픽 선택 모달 띄우는 기능 * design: 핀 뽑아오는 컴포넌트명 수정 및 fixed 부여 * refactor: modal 상태 분리로 인한 수정 * rename: 이미지 컴포넌트 변경 * refactor: 누락된 모달 상태 분리 커밋 기록 * refactor: SVG 컴포넌트를 감싸는 헤드리스 컴포넌트 생성 및 적용 * refactor: 잘못된 타입 수정 * design: 토픽카드 SVG 배치 순서 변경 * design: 핀 상세보기 하단 여백 수정 * design: 토픽인포 여백 수정 * rename: SVG 이미지 파일 변경 * design: 아이콘 버튼 호버링 시 효과 추가 * refactor: 임시 타입 지정 * refactor: 머지 충돌 해결 시 누락된 부분 보완 (#297) * refactor: 인증 인가 관련 수정 (#299) - 액세스 토큰 요청 및 응답 형식 통일 - RestDocs 수정 * [FE] feature/#282 내 정보 관련 컴포넌트 구현 및 getApi 타입 지정 (#303) * feat: 닉네임, 이메일 들 내 정보 관련 컴포넌트 구현 * refactor: getApi 제네릭 타입 지정 및 변경 필요한 타입 수정 * [BE] feature/#250 지도 같이보기 기능 구현 (#257) * feat: 모아보기 기능 구현 * refactor: controller 필드 final 추가 * refactor: URI 및 메서드 네이밍 변경 * test: atlas 테스트 추가 * test: 테스트 코드 리팩터링 * test: 테스트 코드 로직 오류 수정 * refactor: null값 validate 추가 및 개행 추가 * test: 개행 및 DisplayName 수정 * refactor: 메서드 순서 변경 * feat: Response에 isInAtlas 추가 * refactor: convert 로직 간소화 * refactor: 메서드 분리 및 정리 * doc: restDocs 적용 * refactor: MemberController 내 토픽 및 핀 조회 메서드 분리 * [BE] feature/#251 최신 지도 조회 API 구현 (#258) * feat: 최신 토픽 조회 기능 구현 * test: 테스트 추가 및 리팩터링 * test: 테스트 코드 로직 오류 수정 * refactor: null값 validate 추가 및 개행 추가 * test: 개행 및 DisplayName 수정 * test: 개행 및 DisplayName 수정 * docs: restDocs snippets 추가 * refactor: 메서드 순서 변경 * feat: Response에 isInAtlas 추가 * refactor: convert 로직 간소화 * refactor: 메서드 분리 및 정리 * doc: restDocs 적용 * refactor: 메서드 네이밍 수정 * refactor: MemberController 내 토픽 및 핀 조회 메서드 분리 * refactor: 코드 리뷰 반영 * refactor: 코드 리뷰 반영 * refactor: DTO에 작성자 이름 추가 * chore: git conflict 해결 * [BE] hotfix/#311 일부 API 명세 변경, 개발서버 구성환경 수정, 인가 관련 예외 처리 (#312) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * refactor: 권한 부여 API 명세 변경 - 여러 회원에 대한 권한을 한번에 부여할 수 있도록 변경 - 불필요한 권한 id 반환하지 않도록 변경 - 변경 사항 RestDocs 반영 - 관련 테스트코드 수정 * fix: 권한 부여 API 응답코드 201로 변경 * chore : 개발환경에서는 ddl-auto = update 로 설정 * fix : 파라미터 형식 통일 * fix : RestDocs 문서 수정 * refactor : validateMember 수정 --------- Co-authored-by: 준팍(junpak) <[email protected]> Co-authored-by: jaeyeon kim <[email protected]> * [BE] feature/#253 특정 핀에 대해 내 지도에 저장하기 API (#270) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * chore: GitHub Issue 및 PR Template 추가 * feat: 모아보기 기능 구현 * refactor: controller 필드 final 추가 * refactor: URI 및 메서드 네이밍 변경 * test: atlas 테스트 추가 * test: 테스트 코드 리팩터링 * feat: 최신 토픽 조회 기능 구현 * test: 테스트 추가 및 리팩터링 * test: 테스트 코드 로직 오류 수정 * test: 개행 및 DisplayName 수정 * docs: restDocs snippets 추가 * feat: 핀을 나의 토픽들에 복사하는 기능 구현 완료 * test: copyPin 테스트 케이스 및 restDocs 추가 * refactor: 메서드 분리 및 불필요한 개행 삭제 * refactor: 메서드 네이밍 변경 * refactor: 권한 부여 API 명세 변경 - 여러 회원에 대한 권한을 한번에 부여할 수 있도록 변경 - 불필요한 권한 id 반환하지 않도록 변경 - 변경 사항 RestDocs 반영 - 관련 테스트코드 수정 * fix: 권한 부여 API 응답코드 201로 변경 * chore : 개발환경에서는 ddl-auto = update 로 설정 * fix : 파라미터 형식 통일 * fix : RestDocs 문서 수정 * refactor : validateMember 수정 --------- Co-authored-by: jaeyeon kim <[email protected]> Co-authored-by: yoondgu <[email protected]> Co-authored-by: zun <[email protected]> * [BE] feature/#298 인기 (급상승) 토픽 조회 API (#306) * feat: 모아보기 기능 구현 * refactor: controller 필드 final 추가 * refactor: URI 및 메서드 네이밍 변경 * test: atlas 테스트 추가 * test: 테스트 코드 리팩터링 * test: 테스트 코드 로직 오류 수정 * refactor: null값 validate 추가 및 개행 추가 * test: 개행 및 DisplayName 수정 * refactor: 메서드 순서 변경 * feat: Response에 isInAtlas 추가 * refactor: convert 로직 간소화 * refactor: 메서드 분리 및 정리 * doc: restDocs 적용 * refactor: MemberController 내 토픽 및 핀 조회 메서드 분리 * feat: 인기 토픽 조회 기능 구현 * feat: 인기 토픽 조회 기능 API 구현 * test: 인기 토픽 조회 기능 API 테스트 수정 * style: 코드 라인 길이 포맷 수정 * fix: @Transactional 어노테이션 수정 * test: Atlas RestDocs 테스트 코드 수정 --------- Co-authored-by: junpakPark <[email protected]> Co-authored-by: junpakPark <[email protected]> * [FE] feature/#300 즐겨찾기 페이지 구현 (#308) * feat: 즐겨찾기 페이지 구현 * refactor: Bookmark 페이지 이름 변경 * refactor: 즐겨찾기 서버 요청 후 즐겨찾기 데이터 받아오도록 수정 * [FE] feature/#302 내가 만든 지도 목록 모달에 띄우기 (#310) * feat: 내 지도 토픽 목록 list 컴포넌트 구현 및 모달 창에 적용 * fix: 내 지도 저장 모달 띄웠을 때 PinDetail 포커스 제거 * refactor: 내 지도 목록 모달 서버 요청 후 데이터 받도록 수정 * [FE] feature/#301 내 정보 페이지 구현 (#309) * feat: 내 정보 페이지 구현 * refactor: early return 위치 변경 * refactor: 에러 페이지 width 변경 * refactor: MyInfoPage 이름 수정 * refactor: Profile 내 토픽 get 요청 받아 데이터 받도록 수정 * refactor: 프로필 사진 로그인 됐을 시 카카오 프로필 사진으로 변경 * refactor: MyInfo 수정 버튼 삭제 * [FE] Feature/#304 모아보기 구현 (#307) * refactor: 태그 전역상태 생성 및 핀 이름이 같을 경우 동시 삭제되던 오류 수정 * feat: SeveralSelectedTopics 페이지 구현 제 야무진 뻘짓을 기록합니다.... 혹시나 나중에 이 방식으로 쓰인다면 참고자료가 되길.... * refactor: 모아보기 API 명세에 맞게 GET 기능 구현 제 뻘짓을 만회합니다 * remove: 사용하지 않는 페이지 제거 * feat: 모아보기 버튼 클릭 시 모아보기에 추가 및 상태 표시 아이콘 추가 * design: 모아보기 카운터 UI 재배치 * feat: 모아보기 정책에 맞게 7개까지만 모아볼 수 있도록 변경 * feat: 모아보기 및 즐겨찾기 not focused 버튼 SVG 추가 * refactor: props drilling 으로 인한 불필요한 interface 제거 * remove: 불필요한 페이지 컴포넌트 제거 * design: 모아보기 추가 카운터 애니메이션 구현 * refactor: 불필요한 console.log 제거 * fix: id 타입 에러 수정 * refactor: 불필요한 fragment 제거 * style: 불필요한 개행 제거 * feat: 모아보기 토픽을 한번에 삭제하는 기능 추가 * design: 토스트 위치 수정 및 애니메이션 변경 * rename: SVG 파일 변경 * feat: delete API 추가 * refactor: 토픽 타입 변경으로 인한 수정 및 기능 추가 * refactor: post content type 추가 * refactor: 불필요한 console.log 제거 * refactor: 중복 로직 제거 및 메서드명 변경 * refactor: 기존 메서트 사용 및 불필요한 import 제거 * fix: topicCard 타입 변경된 인터페이스 적용 * feat: 로그인 오류 발생 시 toast 띄우는 에러핸들링 추가 * [FE] Feature/#317 권한 관련 기능 구현 (#318) * refactor :불필요한 페이지 삭제 * refactor: 헤더에 토큰 추가 방식 변경 * feat: 기능 요구사항 구현 * feat: 추가 기능 구현 * fix: 버그 일괄 수정 (#320) * fix: 에러 수정 (#321) * refactor: 리다이렉트 페이지 라우트 (#322) * refactor: 머지 후 모든 오류 및 에러핸들링 수정 (#323) * [BE] feature/#319 커스텀 예외 적용 및 예외 처리 구현 (#329) * feat : Exception 처리 뼈대 코드 구현 * refactor : 토픽의 ID 를 통해서 조회하는 경우의 Exception 을 CustomException 으로 교체 * feat: common 및 member 패키지 커스텀 예외 적용 * feat: topic 패키지 커스텀 예외 적용 Co-authored-by: yoondgu <[email protected]> * feat: pin 패키지 커스텀 예외 적용 Co-authored-by: yoondgu <[email protected]> * feat: Location 및 Atlas 패키지 커스텀 예외 적용 Co-authored-by: yoondgu <[email protected]> * feat: Bookmark 및 Permission 패키지 커스텀 예외 적용 Co-authored-by: yoondgu <[email protected]> * feat: AuthInterceptor 커스텀 예외 적용 및 검증 보완 - 로그인이 필요하지 않은 요청에 대해, 비로그인 유저 id 검증 로직 추가 Co-authored-by: yoondgu <[email protected]> * feat: Auth 및 Oauth 커스텀 예외 적용 및 검증 보완 Co-authored-by: yoondgu <[email protected]> * feat: common ArgumentResolver 예외 메시지 보완 Co-authored-by: yoondgu <[email protected]> * feat: GlobalException 및 GlobalExceptionHandler 적용 Co-authored-by: yoondgu <[email protected]> * refactor: image 검증 정규표현식 수정 Co-authored-by: yoondgu <[email protected]> * feat: 500번대 ExceptionHandler 구현 Co-authored-by: yoondgu <[email protected]> * refactor: 불필요 개행 수정 Co-authored-by: yoondgu <[email protected]> * refactor: 불필요 Getter 어노테이션 제거 Co-authored-by: yoondgu <[email protected]> * refactor: exceptionSource 로깅 개행 추가 Co-authored-by: yoondgu <[email protected]> * refactor: ErrorCode record로 변경 및 ErrorResponse 제거 Co-authored-by: yoondgu <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> * [FE] feature/#331 권한있는 토픽 접근 가능 기능 구현 (#332) * feat: infowindow 삭제 추가 * refactor: postApi 수정 * feat: 지도 선택 기능 추가 * Feat: 내 지도에 추가하기 기능 구현 * refactor: 권한 부여 기능 수정 * [FE] feature/#325 웹 접근성 적용 (#327) * feat: 웹 접근성 적용 * refactor: toast 나올 때 리더기가 읽도록 수정 * refactor: 지도 이미지 label 적용 * [FE] Refactor/#324 (#333) * fix: 상태코드 로직 오류 수정 * refactor: API 잘못된 로직 수정 * refactor: 즐겨찾기 버튼 및 id idx 로직 수정 * refactor: 불필요한 권한 로직 제거 * feat: 에러핸들링 로직 추가 * refactor: 즐겨찾기 및 모아보기 관련 idx 로직 수정 * design: 여백 수정 * feat: 즐겨찾기가 없을 경우 대체페이지 추가 * design: 모든 UI 오류 재배치 * design: UI 재배치 * refactor: Map 핀 이름 기능 추가 홈에서 각 토픽 별로 GET * refactor: 각 페이지에서 항목별로 토픽 카드 보이도록 변경 * feat: 내 현재위치 받아오는 util 함수 작성 * design: 윈도우 오류 대응 * refactor: 누락된 suspense 모두 지정 * refactor: 지도 리스트가 비어있을 경우 대체 페이지 수정 * remove: 불필요한 페이지 제거 * refactor: 파비콘 추가 및 홈 GET url 수정 * design: 버튼 네이밍 변경 * fix: 즐겨찾기 버튼 오류 수정 * fix: 오류 수정 (#336) * [BE] feature/#330 로깅 적용 (#334) * feat: 로깅 적용 Co-authored-by: yoondgu <[email protected]> * feat: JVM 시간 서울로 설정 Co-authored-by: yoondgu <[email protected]> * fix: 이미지 검증 정규표현식 수정 Co-authored-by: yoondgu <[email protected]> * fix: 로그인 사용자 검증 오류 수정 Co-authored-by: yoondgu <[email protected]> * test: 로깅 테스트 환경 분리 Co-authored-by: yoondgu <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> * [BE] hotfix/log 로그인 버그로 인한 인터셉터 수정 및 로그백 일부 수정 (#337) * fix: 인터셉터 로직 수정 및 log-back 수정 Co-authored-by: yoondgu <[email protected]> * fix: log-back 추가encoder Co-authored-by: yoondgu <[email protected]> * fix: 로그 파일 저장 위치 변경 Co-authored-by: yoondgu <[email protected]> --------- Co-authored-by: yoondgu <[email protected]> * [FE] Fix/all (#339) * design: 여백오류 수정 * fix: 지도 줌 아웃 리미트 지정 * refactor: 핀 추가 플로우 여러 상황 대응 * design: 임시 커밋 * fix: 배포 페이지와 마크업이 다른 오류 슈정 * refactor: 임시 커밋 * fix: 배포 페이지와 마크업이 다른 오류 수정 * refactor: 라우터 및 에러페이지 및 디자인 시안 문제 모두 수정 * design: 디자인 시안과 다르지 않던 부분 수정 * refactor: 디자인 정책 및 시안과 맞지 않는 부분 수정 진행 * refactor: 불필요한 console.log 제거 및 타입가드 * fix: 뽑아오기 상태 초기화 * [FE] Fix/all (#340) * refactor: 핀추가 거절 멘트 지정 * design: 배포페이지와 로컬이 다른 오류 수정 * chore: 프로젝트 상세설명 추가 * [BE] hotfix/guest 게스트 조회시 발생하던 버그 해결 (#341) * [Docs] GitHub Issue 및 PR Template 설정 (#37) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .gitignore 추가 * chore: GitHub Issue 및 PR Template 추가 * [Docs] GitHub Issue Template 파일명 오류 수정 (#39) * chore: .gitignore 추가 * chore: GitHub PR 및 Issue Template * Revert "chore: GitHub PR 및 Issue Template" This reverts commit 65915f72740bbf22899ef7ac52fefa99cde96a8b. * Revert "chore: .gitignore 추가" This reverts commit 1e1865a1cb7f0a279b4e74c12cd0f66631809ff3. * chore: .g…
작업 대상
Topic 패키지
📄 작업 내용
Topic 패키지 관련 코드 리팩토링 및 테스트 추가 구현
🙋🏻 주의 사항
TopicController는 구현되지 않은 테스트만 추가하였고, 관련 리팩토링은 수행하지 않은 상태입니다.
일정을 맞추기 위해, 해당 테스트 코드 리팩토링은 이후로 미루겠습니다.
스크린샷
📎 관련 이슈
closed #215
레퍼런스