목록[대외활동]/[캡스톤 디자인] (10)
개발자로 후회없는 삶 살기
서론학과 홈페이지의 서버 부하의 80%는 복잡한 DB 연관관계 설계로 인해 조회 시 전송 데이터와 발생 쿼리량이 높기 때문입니다. 이를 JPA 쿼리 튜닝으로 해결하기 위한 고민과 테이블 재 설계 과정을 기록합니다. [Issue][Pull Request] 본론- 졸업 프로세스저희 학교는 졸업 프로세스에 따라 졸업 신청을 4번 하게 되며 따라서 졸업자 목록 테이블과 4개의 졸업 신청 테이블의 연관 관계로 설계되어 있었습니다. 🚨 이처럼 설계한 이유여러 명의 학생이 졸업을 하고 한 학생이 여러번의 졸업 신청을 하기에 다대다 매핑 관계로 설계하고 신청을 할 때마다 student_id가 apply 테이블에 등록했습니다. 졸업을 신청 > apply 테이블에 신청한 학생 id 등록(새 apply id + 동일 st..
서론RDB에 저장하던 RefreshToken의 Network I/O를 개선하기 위해 In-Memory Redis를 도입합니다. 또한, RefreshToken을 도입하여 AccessToken이 탈취 되더라도 인증하는 기능을 추가합니다. 아래 글에서 이어지는 내용입니다. -> 깃허브https://github.com/SangBeom-Hahn/Capstone_Develop/commit/670912b9588debce0f81d223f0a6bf85e5955928 feat: 2단계 인증 구현 · SangBeom-Hahn/Capstone_Develop@670912b*feat: AuthService 기능 구현 *feat: LoginInterceptor 기능 구현 *feat: RefreshTokenSaveResponseDt..
서론 기존에 사용하던 JWT 정책이 변경되었고 다양한 정보를 JWT에 넣기로 했습니다. 그 과정을 기록합니다. 본론 - 관리자 권한 추가 @Enumerated(EnumType.STRING) @Column(name = "roletype", length = 255, nullable = false) private RoleType roleType; 학과 홈페이지 관리를 하는 관리자 분들은 관리자만의 기능을 수행할 수 있어야 합니다. 따라서 로그인 한 사용자가 권리자 권한이 있는지 없는지 검증하는 과정이 필요했습니다. 로직을 어떻게 할까? ✅ 인터셉터를 사용해서 관리자가 아닌 학생이 관리자로 요청을 하면 바로 막아버리면 좋을 것 같다고 생각했습니다. -> 1차 기존 인터셉터 그렇게 처음 만든 인터셉터는 위와 같습..
서론JWT(Json Web Token)은 일반적으로 프론트엔드와 백엔드 사이에서 통신 시 권한 인가를 위해 사용하는 규칙입니다. 현재 진행하고 있는 캡스톤 디자인에서 REST API를 사용 중인데, 웹으로 Form을 통해 로그인하는 것이 아닌, API 호출로 프론트엔드에서 토큰으로 인증을 체크하고자 JWT를 선택하여 구현해보았습니다. 본론- 필요한 코드들저는 인터셉터와 커스텀 Argument Resolver를 이용해서 로그인한 사용자인지 필터링을 할 것이며, JWT를 이용한 로그인 인증을 할 것입니다. 따라서 필요한 파일들은 위 사진과 같습니다. AuthenticationPrincipalConfig : 인터셉터와 Argument Resolver 설정SecurityConfig : 스프링 시큐리티 설정aut..
서론 프로젝트를 프론트와 백엔드로 분리하면서 연동하는 과정을 기록합니다. 본론 저는 최초로 리액트 프로젝트를 만드는 것이 아닌 생성되어 있는 리액트 프로젝트를 pull하여 스프링 프로젝트와 연결시켰어야 했습니다. 따라서 처음부터 리액트를 설치하는 과정에서 몇 개의 과정이 생략이 필요했고 밑에서 자세하게 알아보겠습니다. 1. nodejs 설치 리액트를 설치하기 위해서는 npm 명령어를 할 수 있어야 합니다. npm 명령어를 수행하기 위해 node js를 설치했습니다.(참고 1) 2. npm install 설치된 리액트 프로젝트에서 npm install을 통해 npm을 설치해줍니다. npx create-react-app 최초에 리액트부터 만드는 것이라면, 위 명령어로 리액트 프로젝트를 만드는 것이 필요하지만..
서론 캡스톤을 진행할 때 설계를 모두 마치고 구현을 하던 도중 처음에 설계했던 ERD 모델에서 변경되었던 부분을 기록합니다. 본론 - 학생과 졸업 처음에는 졸업 신청과 학생을 1:n 관계로 설계했었습니다. 1명의 학생이 1번의 졸업을 하고 졸업은 여러 명의 학생에게 신청 받을 수 있기 때문에 이렇게 설계했었습니다. 하지만 졸업을 신청할 때 여러가지 단계가 존재하였습니다. 예를 들어 한 명의 학생이 졸업을 하기 위해서는 신청서를 제출하고 > 제안서를 제출하고 > 중간보고서를 제출하고 > 최종 보고서를 제출해야 하며 이 모든 단계가 졸업 신청의 요소로 들어가야 했습니다. 그러면 이를 어떻게 ERD에 적용해야 할까요? ✅ 이렇게 되면 한 명의 학생이 1번의 신청을 하는 것이 아닌 여러번의 신청을 하게 되어 M..
서론 캡스톤을 진행하며 발생했던 이슈와 개선 사항을 정리합니다. 본론 - 초기 엔터티 구축 첫 번째 기능에 필요한 초기 엔터티를 구축합니다. @Entity @Getter @Table(name = "student") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Student extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "student_id") private Long id; @Column(name = "login_id", length = 255, nullable = false) private String loginId; ..
서론 mysql을 프로젝트에 적용하기 위해 workbench 개념과 사용법, 인텔리제이 연동 방법 등을 정리합니다. 본론 - mysql에 테이블 만들고 값 넣기 1. mysql 다운 mysql을 홈페이지에서 다운받고 version(); 명령어를 실행해보면 위와 같이 나오면 성공입니다. 다운받을 때 이렇게 비밀번호를 설정하는 과정이 있는데 이는 내 로컬 DB 서버에 내 로컬 IP로 접속할 때 필요한 비밀번호입니다. 이후 Workbench에서 연결을 할 때 다른 DB 서버에 연결하려면 다른 DB 서버의 IP를 입력하면 됩니다. 2. setup new connection(참고 1) '+' 모양을 누르면 연결을 추가할 수 있습니다. 연결이란 DB 서버에 연결을 하겠다는 것입니다. 연결할 때 넣어야 할 것은 Co..