[Spring] ThreadLocal이란?
·
Spring
ThreadLocal이란?ThreadLocal은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. 쉽게 말해서 여러사람이 사용하는 물건 보관 창구를 의미하며 여러사람(여러 쓰레드)이 ThreadLocal이라는 공용 창구를 사용하고 ThreadLocal이 사용자(쓰레드)별로 자원을 구분해준다. 그렇다면 ThreadLocal은 왜 어떤경우에 사용할까? 예를 들어 다음과 같은 상황이 있다고 가정해보자.thread-A가 먼저 userA라는 변수를 필드에 저장했지만 thread-B가 userB라는 변수를 같은 필드에 저장했더니 userA를 저장했던 변수에 덮어 씌워져 버렸다. 이렇게 되면 thread-A가 자신이 저장했던 userA라는 값을 사용하기 위해 필드를 호출했을 때 userA가 아닌 userB가 호..
[Spring] Interceptor와 ServletFilter의 차이
·
Spring
ServletFilterSerlvetFilter는 서블릿 스펙에서 제공하는 서블릿 전체에 공통 기능을 추가할 수 있는 기능으로 DispatcherServlet 앞에서 사용자의 요청과 응답을 처리할 수 있다. ServletFilter는 여러 개도 등록이 가능하며 특정 URI에만 필터 기능을 걸 수 있도록 설정할 수도 있다. ServletFilter 구현체를 만드려면 javax.servlet.Filter 인터페이스를 구현해야 한다.public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(Servlet Request reque..
[Spring] @AuthenticationPrincipal null
·
Spring
문제상황 @PostMapping() public ResponseEntity
동시성 이슈 해결방법 (Synchronized, DB Lock, Redis Lock)
·
Spring
문제 상황 Stock.class @Entity @NoArgsConstructor @Getter public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public void decrease(Long quantity) { if (this.quantity - quantity < 0) { throw new RuntimeException("..
리팩토링
·
Spring
리팩토링이란? 새로운 소스코드를 만들어 내는 것이 아니다. 외부 동작은 변경하지 않고, 내부 구조를 변경하는 작업이다. 코드의 가독성을 좋게 한다. 개발자들마다 결과가 다를 수 있다. 리팩토링 주의사항 기능 추가 구현과 동시에 리팩토링을 하는것을 권장하지 않는다. 기능을 추가하기 전, 리팩토링을 먼저 하는 것을 추천 리팩토링 팁 아래 코드를 리팩토링하면서 리팩토링 팁을 알아보겠습니다. public class Main { public static int splitAndSum(String text) { int result = 0; if (text == null || text.isEmpty()) { result = 0; } else { String[] values = text.split("-"); for (S..
[Spring] 스프링 빈 설정 (XML, JAVA, Component Scan)
·
Spring
1. XML스프링의 애플리케이션 컨텍스트는 XML에 담긴 DI 정보를 활용할 수 있습니다. DI 정보가 담긴 XML 파일은 를 루트 엘리먼트로 사용하고 안에는 여러 개의 을 정의할 수 있습니다. 태그에 사용되는 속성들속성 이름설명id빈 객체의 고유 이름으로, 빈 id를 이용해 빈에 접근합니다.name객체의 별칭입니다.class생성할 클래스입니다. 패키지 이름까지 입력해야 합니다.constructor-arg생성자를 이용해 값을 주입할 때 사용합니다.propertysetter를 이용해 값을 주입할 때 사용합니다.setter를 이용한 DI 기능PersonServicepublic interface PersonService { public void sayHello();}PersonServiceImplpub..
[Spring] Spring Framework, Spring Web MVC
·
Spring
Framework 웹 어플리케이션을 개발하기 위해서는 기본 기능과 많은 기능을 설계, 작성해야 합니다. (요청처리, 세션관리, 리소스 관리, 멀티 쓰레드 등) 하지만 기본적인 공통 구조(framework)를 제공한다면 개발자는 웹 어플리케이션 기능 자체 개발에만 신경 쓰면 되기 때문에 생산성이 높아집니다.. 개발자 입장에서는 완성된 구조에 자신이 맡은 코드만 개발해서 넣어주면 되기 때문에 개발 시간을 단축할 수 있습니다. Spring Framework의 특징 POJO(Plain Old Java Object) 방식의 프레임워크 - EJB가 기능 작성을 위해서 인터페이스를 구현하거나 상속하는 것에 비해 일반적인 자바 객체를 이용해서 그대로 사용할 수 있음을 의미합니다. 의존성 주입(DI, Dependency..
[Spring] SecurityConfig, OAuth2UserDetailsService 순환 참조 오류
·
Spring
오류Spring Security와 OAuth 2.0 프레임워크를 이용하여 소셜로그인을 구현하던 중 SecurityConfig 파일과 DefaultOAuth2UserService 클래스를 상속받은 OAuth2UserDetailsService 클래스 사이에서 순환 참조 오류가 발생했다.오류 원인SecurityConfig@Configuration@Log4j2@EnableWebSecurity@EnableGlobalMethodSecurity(securedEnabled = true)@RequiredArgsConstructorpublic class SecurityConfig { private final OAuth2UserDetailsService oAuth2UserDetailsService; private..