Skip to content
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

3주차 리뷰 부탁드립니다. #11

Merged
merged 33 commits into from
Sep 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
59fc4b0
docs: 초기 README.md 정리
suno-boy Sep 18, 2024
f378597
feat: oauth 로그인 및 회원가입 구현
Kdonghs Sep 19, 2024
902b241
docs: README.md
Kdonghs Sep 19, 2024
151c09c
docs: README.md 원상복구
suno-boy Sep 19, 2024
738e630
feat : Base Entity 구현
Sep 20, 2024
00f9bf7
feat : Project Entity 구현
Sep 20, 2024
5c5bced
feat : User Entity 구현
Sep 20, 2024
bac16bd
feat : Guest Entity 구현
Sep 20, 2024
ecc2b94
feat : ProjectOption Entity 구현
Sep 20, 2024
df53512
feat : ProjectOptionDetail Entity 구현
Sep 20, 2024
707a991
feat : Task Entity 구현
Sep 20, 2024
78aefe7
feat : Project DTO 구현
Sep 20, 2024
12b277c
feat : Project Repository 구현
Sep 20, 2024
1313414
feat : Project Controller 구현
Sep 20, 2024
625b5f1
feat : Project Service 구현
Sep 20, 2024
200750f
fix : annotation 수정
Sep 20, 2024
190efda
feat: 팀원 삭제 기능 구현을 위한 Entity 구현
suno-boy Sep 20, 2024
ed10a2b
feat: 팀원 삭제 기능 및 링크 생성 기능
suno-boy Sep 20, 2024
f4fc1a6
fix: 팀원 삭제 기능 Entity 오류 수정
suno-boy Sep 20, 2024
53aa90c
Merge pull request #1 from Kdonghs/kdonghs
sunandrabbit Sep 20, 2024
4323a97
Merge pull request #2 from sunandrabbit/week3
sunandrabbit Sep 20, 2024
3afd012
Merge pull request #5 from kakao-tech-campus-2nd-step3/sunandrabbit
sunandrabbit Sep 20, 2024
7d19a3d
Merge branch 'weekly' into kdonghs
sunandrabbit Sep 20, 2024
c2c682d
Merge pull request #6 from kakao-tech-campus-2nd-step3/kdonghs
sunandrabbit Sep 20, 2024
19f45f4
feat: Task Entity 구현
seoyoung-dev Sep 20, 2024
b3119ca
feat: TaskDto 구현
seoyoung-dev Sep 20, 2024
71d3b73
feat: Task 삭제 기능 구현
seoyoung-dev Sep 20, 2024
aca07d4
Merge branch 'weekly' into seoyoung
sunandrabbit Sep 20, 2024
b1c89a7
Merge pull request #7 from kakao-tech-campus-2nd-step3/seoyoung
sunandrabbit Sep 20, 2024
fed5ee9
Merge branch 'weekly' into sunoboyWeek3
sunandrabbit Sep 20, 2024
d29f7d3
Merge pull request #8 from kakao-tech-campus-2nd-step3/sunoboyWeek3
sunandrabbit Sep 20, 2024
7b43443
Merge pull request #9 from kakao-tech-campus-2nd-step3/weekly
sunandrabbit Sep 20, 2024
85e85c0
Merge pull request #10 from kakao-tech-campus-2nd-step3/develop
sunandrabbit Sep 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 41 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,42 +11,58 @@
# 코드 컨벤션

- angular code conventions을 기반으로 커밋 메세지 작성
- feat : 새로운 기능 추가
- fix : 버그 수정
- docs : 문서 변경
- style : 코드 스타일 변경 (포매팅 수정, 세미콜론 추가 등)
- refactor : 코드 리팩토링
- test : 테스트 코드 추가, 수정
- chore : 빌드 프로세스, 도구 설정 변경 등 기타 작업
- feat : 새로운 기능 추가
- fix : 버그 수정
- docs : 문서 변경
- style : 코드 스타일 변경 (포매팅 수정, 세미콜론 추가 등)
- refactor : 코드 리팩토링
- test : 테스트 코드 추가, 수정
- chore : 빌드 프로세스, 도구 설정 변경 등 기타 작업

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍


---

# 구현 기능 목록

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍


- 인증(김동혁)
- 회원가입
- google oauth2로 구현
- 몇 가지 예외처리된 경로를 제외하면 구글 로그인 요구
- swagger3
- h2-console
- /
- flow
- 토큰 검증
- 토큰이 없다면
- 로그인
- 가입 정보가 없다면 회원가입
- 성공시 토큰 생성 및 반환
- GET Param으로 반환됨
- 실패시 /error로 이동
- 토큰이 있다면
- 토큰 검증
- 토큰 내부의 정보를 파싱
- 로그인
- 코드로 참여
- 프로젝트(김도헌)
- 프로젝트 리스트 조회
- 프로젝트 기간 리스트 조회
- 프로젝트 조회
- 프로젝트 멤버 조회
- 프로젝트 생성
- 프로젝트 설정 수정
- 프로젝트 삭제
- 프로젝트 리스트 조회
- 프로젝트 기간 리스트 조회
- 프로젝트 조회
- 프로젝트 멤버 조회
- 프로젝트 생성
- 프로젝트 설정 수정
- 프로젝트 삭제
- 게스트(권순호)
- 게스트 생성
- 게스트 수정
- 게스트 삭제
- 프로젝트 내 게스트 추가
- 프로젝트 코드 메일로 전달
- 게스트 생성
- 게스트 수정
- 게스트 삭제
- 프로젝트 내 게스트 추가
- 프로젝트 코드 메일로 전달
- 태스크(조서영)
- 태스크 생성
- 태스크 삭제
- 태스크 수정
- 태스크 생성
- 태스크 삭제
- 태스크 수정
- 이벤트
- 독려 이메일 전달
- 각 게스트별 진행도 조회
- 태스크별 진행도 조회
- 독려 이메일 전달
- 각 게스트별 진행도 조회
- 태스크별 진행도 조회
- ...
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
// implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/com/example/team1_be/DTO/AttendUrlResponseDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.team1_be.DTO;

public class AttendUrlResponseDTO {
String attendUrl;

public String getAttendUrl() {
return attendUrl;
}

public void setAttendUrl(String attendUrl) {
this.attendUrl = attendUrl;
}
}
117 changes: 117 additions & 0 deletions src/main/java/com/example/team1_be/DTO/AuthDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package com.example.team1_be.DTO;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자바 패키지 이름 규칙에 따르면 언더스코어(_) 대신 카멜 케이스를 사용하는 것이 좋아요

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

패키지명 수정하겠습니다.


import com.example.team1_be.entity.UserEntity;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.oauth2.core.user.OAuth2User;

public class AuthDTO {

// OAuth2에서 가져온 유저 정보
public static class OAuthAttributes {

private Map<String, Object> attributes;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Map<String, Object>로 두는 것은 좋지 않습니다.
특히 Object를 사용하면 타입 체크가 컴파일 시점에 이루어지지 않아 버그를 발생시킬 수 있습니다.
가능하다면 명시적인 필드를 가진 클래스를 사용하는 것이 어떨까요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/oauth2/core/OAuth2AuthenticatedPrincipal.html

oauth로 부터 .getAttributes()를 받아오기 때문에 데이터 타입을 유지해야 합니다.
인증 플랫폼마다 반환되는 결과가 달라서 각자 값만 받아오기도 어렵습니다.

private String nameAttributeKey;
private String name;
private String email;
private String picture;

public OAuthAttributes(Map<String, Object> attributes, String nameAttributeKey, String name,
String email,
String picture) {
this.attributes = attributes;
this.nameAttributeKey = nameAttributeKey;
this.name = name;
this.email = email;
this.picture = picture;
}

public Map<String, Object> getAttributes() {
return attributes;
}

public String getNameAttributeKey() {
return nameAttributeKey;
}

public String getName() {
return name;
}

public String getEmail() {
return email;
}

public String getPicture() {
return picture;
}

public static OAuthAttributes ofGoogle(String usernameAttributeName,
Map<String, Object> attributes) {
return new OAuthAttributes(attributes, usernameAttributeName,
(String) attributes.get("name"), (String) attributes.get("email"),
(String) attributes.get("picture"));
}
}

// OAuth2User 반환용
public record PrincipalDetails(
UserEntity user,
Map<String, Object> attributes,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기도 Map<String, Object>가 사용되었네요

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상동

String attributeKey) implements OAuth2User, UserDetails {

public UserEntity getUser() {
return user;
}

@Override
public String getName() {
return attributes.get(attributeKey).toString();
}

@Override
public Map<String, Object> getAttributes() {
return attributes;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Collections.singletonList(
new SimpleGrantedAuthority(user.getRole().getKey()));
}

@Override
public String getPassword() {
return null;
}

@Override
public String getUsername() {
return user.getRole().getKey();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}
}
}
171 changes: 171 additions & 0 deletions src/main/java/com/example/team1_be/DTO/ProjectDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package com.example.team1_be.DTO;

import com.example.team1_be.entity.Guest;
import com.example.team1_be.entity.ProjectOption;
import com.example.team1_be.entity.User;
import com.example.team1_be.util.page.PageParam;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

public class ProjectDTO {

public static class getList extends PageParam {

}

public static class create {

private String name;

private Object viewType;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Object 타입보다는 더 구체적인 타입을 사용하는 것이 좋습니다.


private Integer isDelete;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isDelete는 boolean 타입을 사용하는 것이 더 적절할 것 같은데 확인 부탁드려요!


private User user;

private List<Guest> guests;

private List<ProjectOption> options;

private LocalDateTime startDate;

private LocalDateTime endDate;

public create() {
}

public create(String name, Object viewType, Integer isDelete, User user,
LocalDateTime startDate,
LocalDateTime endDate,
List<Guest> guests,
List<ProjectOption> options) {
this.name = name;
this.viewType = viewType;
this.isDelete = isDelete;
this.user = user;
this.startDate = startDate;
this.endDate = endDate;

if (guests == null) {
this.guests = new ArrayList<>();
} else {
this.guests = guests;
}

if (options == null) {
this.options = new ArrayList<>();
} else {
this.options = options;
}
}

public String getName() {
return name;
}

public Object getViewType() {
return viewType;
}

public Integer getIsDelete() {
return isDelete;
}

public User getUser() {
return user;
}

public List<Guest> getGuests() {
return guests;
}

public List<ProjectOption> getOptions() {
return options;
}

public LocalDateTime getStartDate() {
return startDate;
}

public LocalDateTime getEndDate() {
return endDate;
}

}

public static class update {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생성 DTO, 수정 DTO가 한 파일 내에 존재하는데 코드가 길어지는 경우 분리해도 괜찮을 것 같아요.


private String name;

private Object viewType;

private User user;

private List<Guest> guests;

private List<ProjectOption> options;

private LocalDateTime startDate;

private LocalDateTime endDate;

public update() {
}

public update(String name, Object viewType, User user,
LocalDateTime startDate,
LocalDateTime endDate,
List<Guest> guests,
List<ProjectOption> options) {
this.name = name;
this.viewType = viewType;
this.user = user;
this.startDate = startDate;
this.endDate = endDate;

if (guests == null) {
this.guests = new ArrayList<>();
} else {
this.guests = guests;
}

if (options == null) {
this.options = new ArrayList<>();
} else {
this.options = options;
}
}

public String getName() {
return name;
}

public Object getViewType() {
return viewType;
}

public User getUser() {
return user;
}

public List<Guest> getGuests() {
return guests;
}

public List<ProjectOption> getOptions() {
return options;
}

public LocalDateTime getStartDate() {
return startDate;
}

public LocalDateTime getEndDate() {
return endDate;
}

}

}

Loading