본문 바로가기

분류 전체보기

(20)
우리 프로젝트의 회원가입 정책에 관하여 지스트 청원 프로젝트는 '학교 구성원'을 대상으로 '익명성'을 보장한 채 운영돼야 하는 서비스다. 이런 서비스에 특징을 가져가면서 사용자의 편리성을 가져다주어야 하는데, 그 시작인 회원가입 정책에 대해 고민한 부분을 작성하고자 한다. 우리 프로젝트의 요구사항은 다음과 같다. 프로젝트의 요구사항 1. '학교 구성원'은 학교 이메일을 가진 사람 전원이다. 2. '익명'으로 진행되기 때문에 최소한의 개인 정보로 회원 가입을 진행한다. 3. 학교 측의 데이터를 받을 수는 없는 상황이다. 이때 최소한의 개인 정보에 대해 우리 팀은 '학교 이메일' '비밀번호' 이 두 가지 만을 사용하도록 결정했다. 별도의 아이디를 가지게 되면 사용자의 불편함을 초래할 것이라 생각했다. 학생, 직원, 교수의 직업을 입력받아 데이터의..
우리 프로젝트는 왜 세션을 도입하게 되었는가? 지스트 청원 프로젝트에서 유저 인증 방식을 도입하는 데 있어 세션으로 결정한 과정을 작성해보고자 한다. 팀 내 발표를 정리한 글이다. 인증 방식 HTTP의 비연결성, 무상태성의 특징으로, 사용자의 로그인 상태를 유지하는 별도의 방법이 필요하다. 대표적인 방법에 세션 방식과 토큰 방식이 있다. 세션 방식 세션 방식은 서버 측에 로그인 정보를 저장하는 방식이다. 1. 어떤 정보를 서버 측 세션에 저장할 것인가 httpSession.setAttribute(SESSION_KEY, new SimpleUser(user)); key-value의 형식으로 세션에 정보를 저장할 수 있다. 이때, value에 저장되는 정보는 로그인한 유저를 식별할 수 있어야 한다. 추가적으로 우리 팀은 UserRole에 대한 정보를 추가..
SpringBoot 존재하지 않는 API 요청의 응답 커스마이징하기 SpringBoot 에서 존재하지 않는 api 요청에 대한 에러메시지를 커스터마이징한 과정을 소개한다. 배경 프로젝트를 진행하면서 api의 url을 실수로 잘못 입력했을 때, 에러의 원인을 확인하지 못해 디버깅 과정에 많은 시간을 사용했다. 이런 상황에 해당하는 적절한 에러 메시지를 응답해야 한다 생각했고, 코드를 하나씩 분석하기 시작했다. DispatcherServlet 들여다보기 DispatcherServlet의 doDispatch 메소드를 확인해보면, mappedHandler가 존재하지 않은 때, noHandlerFound 메소드가 실행된다. 메소드 내부를 보면 throwExceptionIfNoHandlerFound에 값에 따라, Exception을 throw하는 지의 여부가 결정된다. 기본 설정은..
멀티 모듈 적용하기 with Gradle 이번 글에서는 프로젝트를 구성하는 데 있어 멀티 모듈 활용했을 때의 장점과 간단한 설정 방법을 알아본다. 멀티 모듈의 개념을 처음 접하는 사람들이 읽어보기를 추천한다. 멀티 모듈이란? 오라클 자바 문서에서는, 모듈을 패키지의 한 단계 위의 집합체이며, 관련된 패키지와 리소스들의 재사용할 수 있는 그룹이라고 정의한다. 운영하던 서비스를 관리자 서버(admin)와, 사용자 서버(web)를 분리하여 운영할 필요성이 있다고 해보자. 하나의 모듈로 구현을 진행한다면, 각각 별도의 프로젝트를 만들고 많은 부분의 코드를 복사+붙여넣기를 통해 구현할 것이다. Java 빌드 도구의 멀티 모듈을 사용하면, 공통된 구현(common)을 공유하는 방식으로 코드를 작성할 수 있다. 왜 멀티 모듈을 사용하는가? 코드의 중복을 줄..
SpringBoot 예외 처리에 관한 고찰 SpringBoot는 다양한 예외 처리 방법을 제공한다. 편리한 만큼 궁금증도 많이 들었던 예외처리 부분을 코드를 들춰보는 게 익숙해진 지금 파헤쳐보고자 한다. ExceptionHandler를 사용해 본 경험이 있는 독자에게 추천한다. 다양한 SpringBoot의 예외 처리 방법 SpringBoot에서 예외 처리를 하는 방법은 다양하다. 그중 자주 사용되는 방식의 3가지는 다음과 같다. Controller에 ExceptionHandler 정의 ControllerAdvice에 ExceptionHandler 정의 Exception에 ResponseStatus 어노테이션 추가 이처럼 다양한 방식의 구현을 제공한다는 것은 장점이다. 하지만, 그만큼 궁금증도 든다. 어떤 방식이 가장 우선순위가 높은지, 각 구현 ..
SpringBoot AutoConfiguration을 대하는 자세 SpringBoot의 AutoConfiguration은 정말 편리하게 의존성만 추가해주면 관련된 기능들이 모두 설정된다. 편리한 만큼 이를 커스터마이징하는 데는 주의가 필요하다. 이 글에서는 Spring AutoConfiguration의 간단한 원리를 알아보고 어떤 관점으로 바라봐야 하는지 제시한다. @SpringBootApplication @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConf..
HTTP/2 프로토콜 NGINX 적용하기 HTTP/2 프로토콜의 특징과 NGINX에서의 간단한 설정 방법에 대해 알아본다. HTTP/2를 알아보기 전에, 그 이전 프로토콜인 HTTP/1.x를 먼저 알아보자. 대부분의 서버(NGINX, apache, SpringBoot ...등)는 기본설정으로 HTTP/1.1 이 적용되어 있다. HTTP/1.x HTTP/1.0 HTTP/1.0에서는 기본적으로 단기 커넥션(Short-lived connections)을 제공한다. 요청마다 커넥션을 매번 새롭게 생성하고 응답이 도착하고 연결을 닫는다. 매번 TCP 핸드 셰이크의 오버헤드가 발생한다. 하나의 커넥션 안에서, 요청에 대한 응답이 오고 난 다음에야 새로운 요청을 보낼 수 있는 구조이다. HTTP/1.1 HTTP/1.0의 다음 버전인 HTTP/1.1 에서는 ..
Pageable을 이용한 Pagination을 처리하는 다양한 방법 Spring Data JPA에서 Pageable 를 활용한 Pagination 의 개념과 방법을 알아본다. Pageable을 활용한 Pagination이 무엇인가? 많은 게시판은 모든 글을 한 번에 보여주지 않고 페이지를 나눠 쪽수별로 제공한다. 정렬 방식 또한 설정하여, 보고 싶은 정보의 우선순위를 설정할 수도 있다. 이처럼 정렬 방식과 페이지의 크기, 그리고 몇 번째 페이지인지의 요청에 따라 정보를 전달해주는 것이 Pagination 이다. 이를 개발자가 직접 구현해서 사용할 수도 있으나, JPA에서는 이를 편하게 사용할 수 있도록 Pageable 이라는 객체를 제공한다. 'page=3&size=10&sort=id,DESC' 형식의 QueryParameter를 추가로 요청을 보내게 되면..