[Java] List.of()와 Arrays.asList() 차이
·
Java
문제List에 데이터를 추가할 때, null값 그 자체를 추가해야 하는데 NPE 에러가 발생했다.List.of() 메서드를 이용해 List를 만들어주었는데 List.of() 메서드는 null 요소를 허용하지 않기 때문에 발생한 문제였다. 해결해결은 간단히 List.of() 메서드 대신 Arrays.asList() 메서드를 사용하는것으로 변경하여 문제를 해결 할 수 있었는데, 이 둘의 차이가 무엇인지 알아보자. List.of() vs Arrays.asList()List.of()우선 List.of() 메서드는 자바9 버전 이후에 도입된 메서드로 파라미터로 전달받은 값들을 불변 리스트로 만드는 역할을 한다. 그리고 요소 하나하나 null인지 Objects.requireNonNull()메서드로 검사를 한다. 그..
[Spring Security] ProviderManager와 AuthenticationProvider 사용하기
·
Java/Spring Security
본 포스팅은 ProviderManager와 AuthenticationProvider가 무엇인지 이해하고 이들을 이용해 인증하는 방법을 공부합니다. ProviderManager ProviderManager는 이름에서도 알 수 있듯이 provider를 관리하는 manager클래스 입니다. 예를 들어, 어떤 일을 하는데 작업을 하는 사람만 있다면 작업자들은 어떤 일을 누가 해야 할지 모를 수 있는데, 작업을 관리하는 관리자가 있다면 어떤 작업을 어떤 사람이 할지 지시를 해줌으로써 좀 더 효율적으로 작업을 할 수 있습니다. 이처럼 인증 작업을 어떤 클래스가 할지 정해주는 역할을 하는 것이 ProviderManager입니다. 즉, 인증 작업을 관리하는 매니저라고 생각할 수 있습니다. ProviderManager는..
[Spring Security] SecurityFilterChain 파헤치기
·
Java/Spring Security
본 포스팅은 Spring Security의 전체적인 흐름과 FilterChain이 어떻게 동작하는지 이해하는 것을 목표로 합니다. 우선 클라이언트가 HTTP 요청을 했을때 security가 어떻게 작동하는지 흐름부터 살펴본 뒤, 하나씩 알아보겠습니다. 클라이언트의 HTTP 요청이 서버에 도착합니다. "DelegatingFilterProxy"라는 서블릿 필터가 해당 요청을 가장 먼저 받아 "FilterChainProxy"에게 요청을 처리하도록 위임합니다. "FilterChainProxy"는 자신이 관리하고 있는 여러개의 "SecurityFilterChain"에게 순서대로 요청을 넘깁니다. 요청에 적합한 "SecurityFilterChain"내의 filter가 차례대로 실행되며, 각각의 filter는 보안(..
[Spring Security] SecurityContextHolder 이해하기
·
Java/Spring Security
Session 관련 문제가 발생해 프로젝트의 Security 설정 부분을 살펴보다 Spring Security 부분을 공부를 해야겠다는 생각이 들었다. 그래서 거대한 Spring Security 부분을 차근차근 정리하면서 공부해보려고 한다. SecurityContextHolder SecurityContextHolder는 인증된 사용자의 정보를 저장하고 있는 저장소이다. SecurityContextHolder의 구조를 사진으로 보면 SecurityContext를 감싸고 있고 SecurityContext 안에 Authentication(인증)이 저장되어 있다. SecurityContextHolder 설정 1. SecurityContext securityContext = SecurityContextHolder..
[Java] 불변 클래스로 변경 가능성을 최소화하자
·
Java
Effective Java의 Item 17을 읽고 정리한 내용입니다. 변경 가능성을 최소화하라 불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. (객체가 파괴되는 순간까지 절대 달라지지 않는다.) 클래스를 불변으로 만들기 위한 규칙 객체의 상태를 변경하는 메서드를 제공하지 않는다. 클래스를 확장할 수 없도록 한다. (final 키워드 사용) 클래스의 모든 필드를 final로 선언한다. 클래스의 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. 5번 규칙이 잘 이해가 되지 않아 좀 더 자세히 정리해 봤다. 5번 규칙이 의미하는 바는 캡슐화라는 불변성의 측면을 나타내는데 더 자세히 말하면 객체의 내부 상태가 자체 메서드를 통해서만 변경되..
[Spring] Spring Servlet과 Servlet Container란? (DispatcherServlet)
·
Java/Spring
Spring Servlet이란? Spring Servlet은 웹 애플리케이션에서 클라이언트의 요청을 처리(요청을 받고, 응답을 반환)하는 작업을 한다. 일반적으로 이 Servlet을 Spring MVC 패턴에서 DispatcherServlet이라고 불린다. (Servlet은 일반적인 개념과 인터페이스를 나타내고, DispatcherServlet은 Spring의 특정 구현을 나타낸다.) 용어가 좀 헷갈릴 수 있는데 간단히 말하면 DispatcherServlet은 Servlet이지만 모든 Servleet이 DispatcherServlet은 아니다. Spring에서 DispatcherServlet의 역할은 Spring 기반 웹 애플리케이션의 앞단(front controller)에서 웹 요청을 적절한 Contr..