처음부터 차근차근
프로젝트 설명 본문

프로젝트 명 : 한보고
기술스택 : Spring boot, JPA, Spring Security
기간 : 2022-09-29 ~ 진행 중
사용한 툴 : intellij
맡은 부분 : 로그인과 로그아웃 구현, 공지사항 REST API, 예외처리 등등
버전관리 : https://github.com/Kim-ggum/Hanbok-Info/tree/ksy
노션 : https://large-hyena-d25.notion.site/99f6f38e65c144df9652562312d476c8
설명 : 한복에 대해서 소개하고, 한복 대여소의 위치 정보를 알 수 있는 사이트.
팀원들과 현재 진행상황, 코드 부가 설명 등의 의사소통을 할 때 노션을 사용했습니다.
Spring Security를 사용해서 로그인, 로그아웃 부분을 구현했고, JUnit을 사용해서 테스트 주도 개발을 했습니다.
http 메소드를 사용해서 기본적인 REST API를 구현했고,
공지사항 쪽 예외처리를 공들여 작성했으며, OOP에 주의하며 최대한 재사용 가능하게 개발하도록 노력했습니다.
직접 작성한 코드 간단 설명
공지사항 REST API


기본적인 공지사항 CURD 부분입니다.
GET, POST, PUT, DELETE 매핑을 이용해서 REST API를 만들었고, JPA의 Pageable을 사용해서 페이징 처리를 했습니다.
이미지 업로드


이미지 업로드는 위지윅 에디터인 CKEditor을 이용해서 실시간 이미지 업로드를 개발했습니다.
가장 최신 버전의 CKEditor5를 이용했고, 아래는 서버 단의 이미지 업로드 코드 입니다.

이미지는 MultipartFile List로 받아서 여러개의 이미지를 한 번에 업로드 할 수 있게 했고,
UUID 클래스를 이용해서 이미지 파일에 새로운 이름을 부여하여 저장했습니다.
로그인, 로그아웃
로그인과 로그아웃 부분은 Spring Security를 사용해서 개발했습니다.
UserDetails 인터페이스를 이용해서 form 로그인 하는 방식으로 구현했고, 로그인 실패시 로그인 실패 핸들러를 호출해 에러 메세지를 초기화시켰습니다.

위 코드는 Spring Security 설정파일 입니다.
form에 있는 아이디와 패스워드 태그의 name값을 커스텀했고, 로그인에 실패시 로그인 실패 핸들러를 호출하게 설정했습니다.


위 코드는 로그인에 실패했을 때 호출되는 핸들러 입니다.
생긴 Exception에 맞춰 에러메세지를 대입하고, 세션 처리해서 다시 로그인 페이지로 redirection 시켰습니다.
유저 권한 enum형으로 저장
유저의 권한 부분은 String이나 숫자로 저장하지 않고, enum형을 이용해서 저장했습니다.
권한 이름은 Spring에서 제공하는 이름을 따랐습니다.



권한이 enum형이라 db에 저장할 때 형변환시켜서 저장했어야 했는데 저는 AttributeConverter을 이용하는 방식을 사용했습니다.
유저의 권한(enum형)을 db에 저장할땐 convertToDatabaseColumn을 이용해서 숫자로 저장하게 했고,
반대로 db에서 가져올 땐 convertToEntityAttribute를 이용해 숫자를 다시 enum형으로 변환해서 저장했습니다.
JPA auditing 사용
BaseEntity 만들어서 생성날짜, 수정날짜가 자동 대입되게 개발했습니다.


테스트 주도 개발(TDD)
저는 이 프로젝트를 할 때 테스트 주도 개발을 해서 코드의 품질을 높였고,
실패 코드와 성공 코드를 작성한 후 통과되면 그 후에 실제 서비스 코드를 작성하는 방식으로 개발했습니다.
JUnit의 MockMvc와 Mockito를 사용해서 가짜 객체(Mock 객체)를 만들어서 단위 테스트를 했고,
로그인, 로그아웃, Controller, Service, Entity 등을 테스트했습니다.
테스트 코드가 너무 많은 관계로 대표적인 코드만 올렸습니다.



예외처리
custom exception을 만들어서 try catch 문으로 예외를 잡고, ControllerAdvice로 예외를 처리하는 방식을 사용했습니다.


Crud 실패 exception을 하나만 만들어서 메세지를 초기화하는 방식으로 exception을 재사용했습니다.

이런식으로 contorller advice안에 custom exception을 핸들링하는 함수를 만들어서 에러 메세지와 상태코드를 담아 에러 페이지를 반환하는 방식으로 개발했습니다.



이런식으로 OOP를 생각하면서 에러 페이지를 재사용했습니다.