선생님은 롤링페이퍼를 작성할 수 없게 학생 기반으로만 CRUD API 개발을 해놨었다...
학생들이 이용하는 것이다라는 생각에 사로잡혔었나 왜 이렇게 개발을 해놨는지 모르겠다..
이런 것이 리팩토링의 중요성인 거 같다!! 선생님 작성기능을 추가해 보자!!!
Paper 서비스의 선생님 작성 권한 추가 과정
- 문제점 파악
- 권한 처리의 불완전성
- Paper 서비스가 학생(Student) 중심으로만 설계
- 선생님(OAuth2User)의 paper 작성 기능 부재
- createPaper, updatePaper, deletePaper 모두 student_id를 기반으로 동작
- 데이터 구조의 제한
- Paper 엔티티가 student_id를 필수(NOT NULL)로 요구
- 선생님이 작성한 paper를 저장할 수 없는 구조
- 응답 데이터의 불충분
- PaperResponseDTO가 학생 정보만 포함
- 작성자가 선생님인 경우 처리 불가능
- 해결 방안 모색
- 엔티티 수정
- Paper 엔티티의 student_id를 nullable로 변경
- User(선생님) 연관관계 추가
- CreatedBy enum으로 작성자 타입 구분 (STUDENT/TEACHER)
- 권한 처리 로직 개선
- CustomOAuth2User(선생님)와 CustomStudentDetails(학생) 구분
- 선생님은 모든 paper 수정/삭제 가능하도록 처리
- 학생은 자신의 paper만 수정/삭제하도록 제한
- 응답 구조 개선
- PaperResponseDTO에 authorRole 필드 추가
- SSE 이벤트에도 작성자 구분 정보 포함
- 구현 및 해결
Paper 엔티티 수정
@Entity
public class Paper extends BaseTimeEntity {
@ManyToOne
@JoinColumn(name = "student_id", nullable = true)
private Student student;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@Enumerated(EnumType.STRING)
private CreatedBy createdBy;
}
권한 처리 로직 구현
public PaperResponseDTO createPaper(Long rollId, PaperRequestDTO paperRequestDTO) {
if (authentication.getPrincipal() instanceof CustomOAuth2User) {
// 선생님(User)인 경우의 처리
} else {
// 학생인 경우의 처리
}
}
응답 DTO 개선
public class PaperResponseDTO {
private Long paperId;
private String content;
private String authorName;
private String authorRole;// STUDENT or TEACHER
}
- 결과
- 선생님과 학생 모두 paper를 작성할 수 있게 됨
- 권한에 따른 적절한 접근 제어 구현
- 작성자 정보가 명확하게 구분되어 전달
- SSE를 통한 실시간 업데이트에도 작성자 정보 포함
- 남아 있는 의문점
아직 남아있는 문제로는 이렇게 작성자에 따라 나머지 값은 null로 박힌다는 것이다. 이렇게 처리했으면 안 됐을 거 같다!
User라는 공통 테이블을 만들고, 이 테이블에 userType이라는 필드를 추가해서
userType에는 TEACHER나 STUDENT 값이 들어가게끔 했으면 됐을까?라는 의문이 든다
하지만 이것 또한 선생님 로그인 시 pinnumber가 null 값이 된다. '상속'을 받는 키워드가 있지만 내 수준에선 피치 못하게
null을 받아들여야 될 거 같다... 널.. 널 하게 null을 받아들이자... null null 하게 푸합.. 나중에 DB 공부 제대로 해보자!
🙇♂️ 마무리
어느덧 이번 년이 끝나간다. "정말 이번 년을 알차게 보냈어?"라고 누군가가 나에게 묻는다면 나는 한치의 망설임 없이
"아니요"라고 자신 있게 대답할 수 있다. 하지만, 작년과 비교했을 때 엄청나게 발전했던 이번 년이었던 거 같다.
물론 더딜지 언정, 언제나 우상향 곡선을 그리는 개발자가 되도록 계속하여 정진해야겠다!!(내 주식과 다르게)
'Project > Sparkle-Note' 카테고리의 다른 글
[Project] Spakrle Note / JWT 토큰 내 사용자 정보 개선하기 (2) | 2024.11.12 |
---|---|
[Project] Sparkle Note / 사용자 인증 정보 구분하기 (1) | 2024.11.12 |
[Project] Sparkle Note / JWT 토큰 전달 (0) | 2024.11.02 |
[Project] Sparkle-Note / 데일리로그 (0) | 2024.10.25 |
[Project] Sparkle-Note / 데일리로그 (1) | 2024.10.14 |