Spring
Singleton Pattern과 Inversion of Control
Singleton PatternInstance가 생성될때 오직 하나의 Instance가 생성되는 것을 보장하는 것을 목표로 하는 디자인 패턴. SingleTon Pattern의 여러 Client들이 접근하는 객체를 하나의 메모리 공간에서 관리할 수 있기 때문에 메모리 효율성이 좋고 객체의 상태관리를 하기에 용이하다.하지만 이러한 Singleton Pattern은 Application Level에서의 Global State로써 동작하기 때문에 복잡한 의존성 관리와 멀티쓰레드 상황에서 쓰레드 안정성이 주된 단점으로 뽑히게 된다.이러한 Singleton Pattern의 단점을 보완하기 위해 적용하는 것이 Inversion of Control 패턴이다.Inversion of Control객체의 의존성 관리 및 ..
[Spring] SpringSecurity와 Jwt : 이론편
이번 글에서는 SpringSecurity를 이용한 Jwt방식의 인가 처리에 대한 방식과 관련 용어를 정의해보겠다. 용어 설명 우리가 SpringSecurity를 이용해서 client 요청에 대해서 인증을 하고 권한을 부여하기 위해서 이를 위해 노력하는 등장인물들에 대해 먼저 알아봐야한다. 1. Filter Spring Security는 request에 대해서 Dispatcher servlet이 처리하기 전에 Filter를 통하여 request에 대한 검사를 진행하고 해당 request에 대해서 권한을 부여해준다. 권한을 부여해주는거는 다르게 말하면 request에 대해서 SecurityContext를 부여한다고 이야기할 수 있다. 2. SecurityContext SecurityContext란 무엇일까?..
[Spring ] SLF4J을 이용한 스프링 로그 작성
서버에서 로그를 상세히 적어두면 디버깅이나 서버 오류가 발생했을 때 쉽게 파악할 수 있어 유지보수에 있어서 중요하다. 로그는 총 7단계로 나뉘는데 설명을 요약하자면 아래와 같다. 로그 레벨과 설명 레벨 설명 ALL custom level을 포함한 모든 로그를 저장하는 레벨이다. DEBUG 프로그램 상 아주 단위의 행동들을 기록하는 레벨이다. INFO 프로그램 상 큰 단위, 덩어리채로 정보를 기록하는 레벨이다. WARN 잠재적으로 위험할 수 있는 상태가 될 수 있는 정보를 기록하는 레벨이다. ERROR 원래 설정된 error로 프로그램 구동에는 영향을 미치지 않을 수 있는 것들을 기록하는 로그레벨이다. FATAL 원래 설정된 error이긴 한데 프로그램 중단을 야기시키는 것만 기록하는 로그레벨이다. OFF..
[Spring]JUnit에서 Async메소드의 비정상적인 종료 - 1편
API를 만드는 중에 JUnit으로는 Async로 된 메소드가 제대로 작동을 하지 않고 실제 프로그램을 구동시켰을 때 메소드가 정상적으로 작동하는걸 확인했다. 해당 상황을 재현해보고 분석해보는 시간을 가지겠다. 상황은 다음과 같다. Controller에서 Service layer에 있는 메소드를 총 N 번 호출한다. Service Layer의 해당 메소드는 비동기로 처리가 되고 해당 메소드는 0부터 100까지 Count를 한다. 매 카운트마다 100밀리초를 Thread.sleep을 한다. 사실상 코드는 아무 문제가 없어 보인다. 코드는 다음과 같다. 1. Controller public class AdminController { @Autowired TestService testService; @PostM..
[Spring] Spring Security의 이해
Spring Security는 자바 어플리케이션에서 인가와 인증을 제공하는 것에 초점을 맞춘 프레임 워크이다. 스프링에서 주장하기로는 Spring security의 확장성이 매우 큰 장점이라고 한다. 근데 사실 Spring security를 사용하면 상당히 추상적이라 어떻게 접근 권한을 부여하는지에 대한 이해가 부족한 채로 그냥 사용하는 경우가 많다. 쇼핑몰을 만드는 프로젝트를 하면서 관리자 페이지랑 사용자 페이지랑 구분하면서 Spring security를 사용했다. 근데 너무 이해가 안되고 어떤 방식으로 굴러가는지도 파악이 안되서 아키텍쳐를 뜯어 봐야겠다는 생각이 들어 글을 쓰게 되었다. 먼저 그림을 보고 그림을 바탕으로 글을 진행하겠다. 1. Authentication Filter request가 들..
[Spring JPA] ORM과 JPA
[Spring JPA] ORM과 JPA Status: Done ✨ ORM이란? ORM은 객체와 DB 테이블이 매핑을 이루는 것을 의미한다. 즉, 내가 코드 상에서 생성한 객체가 DB상에 어떤 테이블과 연결이 된다는 것을 의미한다. 이렇게 되면 내가 객체를 조작함으로써 DB를 조작할 수 있게 된다. 이러한 예시로 우리는 JPA를 떠올릴 수 있다. 우리는 JPA에서 DB에 대한 접근을 시도할 때 직접 sql 쿼리문을 만들지 않는다. 다만 객체를 이용한 메소드를 통해 이를 관리할 뿐이다. 예시를 보자 SELECT * FROM user → user.findAll() 해당 예시는 user라는 테이블에 모든 정보를 가져오는 것인데 우리는 이를 user라는 객체와 user테이블을 맵핑한 후 findAll이라는 메소드..
[Spring] Controller request 유효성 검사
Request 유효성 검사 서버는 client로 부터 값을 받아서 사용할 때 client로 받은 정보가 서버에서 원하는 형식 혹은 값의 조건에 맞는지 검사를 해야한다. 이를 유효성 검사라고 한다. 이러한 유효성 검사는 class내에 method를 사용하여 검사를 진행했었다. 하지만 유효성 검사는 dto마다 동일하게 혹은 비슷하게 적용 될 수 있고 이에 따라 전체적인 코드 내에서 유효성 검사가 이뤄지는 곳이 여러 Controller에 산재할 수 있다. 따라서 Spring에서는 제약 조건이 부여된 객체에 대해 빈 검증기(Bean Validator)를 이용해서 검증하도록 해주는 어노테이션이 존재한다. 이번에는 이에 대해 정리하려고 한다. BeanValidation 우리가 사용하는 dto에는 원하는 형식이 존재..