목록분류 전체보기 (34)
참새의 이야기
변화하는 요구사항에 대응하기 위해 동작 파라미터화를 사용할 수 있다. 하지만, 동작 파라미터화는 코드가 길어지게 한다. 자바 8에서는 람다 표현식으로 이 문제를 해결한다. 요구사항에 대응 녹색 사과 필터링 public static List filterGreenApples(List inventory) { List apples = new ArrayList(); for (Apple apple:inventory) { if(Green.equals(apple.getColor())) { apples.add(apple) } } return apples; } 녹색 사과를 필터링하는 경우만 생각하면 위의 코드도 좋은 코드가 될 수 있다. 갑작스럽게 빨간 사과를 필터링하고 싶다는 요구 사항이 추가되면 어떻게 대응할 수 있을..
자바 8은 병렬 연산을 위해 스트림 API를 지원한다. 이 스트림 API 덕분에 메서드에 코드를 전달하는 기법(메서드 참조와 람다)과 인터페이스의 디폴트 메서드가 존재할 수 있다. 스트림 처리 스트림을 정의하자면 ‘한 번에 하나씩 만들어지는 연속적인 데이터 항목들의 모임’이다. 자바 8의 java.util.stream 패키지에는 Stream Interface가 존재한다. Stream는 T 형식으로 구성된 일련의 항목을 의미한다. 이 스트림에 대하여 스트림 API는 많은 메서드를 제공하고, 이를 조합하여 스트림 파이프라인을 구성하여 사용하게 된다. 덕분에 스레드를 활용하지 않아도 스트림이 알아서 병렬적인 처리를 해준다. 동작 파라미터화: 메서드에 코드 전달하기 코드를 API로 전달하는 기능이다. sort ..

Servlet Authentication Architecture 스프링 시큐리티의 인증은 아래의 조각들이 하나가 되어 움직인다. 가장 핵심이 되는 SecurityContextHolder 부터 하나씩 알아보자. SecurityContextHolder 아래 그림은 SecurityContextHolder 의 구조를 보여준다. 이름에서부터 나타나듯이 SecurityContext를 가지고 있다. SecurityContextHolder 는 인증된 사람에 대한 정보(detail)를 가지고 있다. SecurityContext가 채워지는 방식과 무관하게 값만 채워지면 현재 인증된 사용자로 인식한다. SecurityContextHolder 가 SecurityContext 를 가지고 있기 때문에 아래와 같이 간단하게 인증 ..

NewFit을 개발하면서 spring security에 OAuth2.0 + JWT의 조합으로 인증/인가를 구현했다. 단순히 코드를 여기저기서 긁어와서 구현하기보다 원리정도는 알고서 한줄 한줄 신중히 짜고 싶다는 생각에 공식 문서를 읽게 됐다. 지난 5월쯤에 처음 읽었을 때는 filter가 뭔지도 잘 모르겠었는데, MVC 강의를 들으면서 filter가 어떤 순서로 등장하고 어떻게 동작하는지를 배우고 다시 읽으니 이제는 이해가 되는 것 같다. 사실 아래의 내용은 공식 문서를 읽고 정리한지 두 달 정도 지난 내용이지만, 노션 창고에 있는 글을 하나씩 티스토리에도 옮기고자 이렇게 복붙 비슷한 걸 하게되었다. Security Architecture 스프링 MVC를 공부하면서 서블릿과 필터 구조에 대한 이해도가 높..
MVC의 처리 방법 WebServerCustomizer 이전 글에서 다뤘던 WebServerCustomizer 를 이용한 예외 처리를 살펴보자. @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } return new MemberDto(id, "hello "+ id); } 위와 같이 Exception을 사용하여 WebServerCustomizer 에게 처리를 요청하면, 정상적인 요청은 JSON 형식으로 반환하지만, 예외 발생 시에는 Html이 반환된다. WebServerCustom..

서블릿 예외 처리 스프링이 제공하는 예외 처리 방식을 공부하기 전에 서블릿 컨테이너는 예외를 어떻게 처리하는지 알아볼 필요가 있다. 서블릿을 이용할 경우 두 가지 방식의 예외 처리법이 있다. Exception response.sendError(HTTP_STATUS_CODE, ERROR_MESSAGE) Exception 웹 애플리케이션은 request마다 thread가 할당되고 서블릿 컨테이너 안에서 실행된다. @Controller public class ServletExController { @GetMapping("/error-ex") public void errorEx() { throw new RuntimeException("예외 발생"); } } 애플리케이션이 예외를 처리하지 못한다면 예외는 서블릿 ..
로그인 처리를 위해 ArgumentResolver 를 사용하면 세션 정보를 활용하는 과정이 조금 더 편리해진다. 기존 방법에서는 HttpServletRequest 에서 직접 세션 정보를 꺼내서 사용하거나 @SessionAttribute 애노테이션으로 매핑해 사용했다. @SessionAttribute 애노테이션을 사용하면 그나마 간단해지기는 하지만 매번 name과 required를 설정해 주는 것도 꽤 번거로운 일이다. @Login 이라는 애노테이션을 직접 만들어 활용해 보자. @Login @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface Login { } @Target(ElementType.PARAMET..
웹 개발을 하다 보면, 로그인을 한 사용자만이 접근할 수 있는 페이지가 있다. 각 페이지마다 로그인 여부를 따로 확인하면 로그인 로직이 변경될 때마다 수정할 부분이 많아진다. 이런 공통적인 처리는 서블릿 필터나 스프링 인터셉터로 하면 간단해진다. 서블릿 필터 우선 필터는 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 의 흐름으로 호출된다. 필터에서 사용자가 로그인 되어 있다면 서블릿으로 흐름을 넘기고, 그렇지 않다면 넘기지 않고 끝을 낸다. 필터는 체인으로 구성되므로 체인에 여러 필터를 추가하여 적용할 수 있다. WebConfig파일을 생성하고 아래와 같이 Bean을 등록하여 사용하는 것이다. Bean 등록 시에 필터의 순서와 필터를 적용할 URL 패턴을 지정한다. @Bean publi..