목록전체 글 (16)
잡동사니를 모아두는 서랍장
구직과 퇴사와 인수인계 때문에 현생이 혐생이었어서 이제야 새로운 글을 작성한다. 한달만 놀고 다시 출근하면 좋겠다... 한창 전 직장에서 일할 때, 요청에 들어온 데이터로 인증 여부를 판별해야 하는 일이 있었다. 하지만 한 가지 문제가 있었는데...판별 데이터가 Request Body에 있고 나는 이것을 필터가 아니라 인터셉터에서 읽어내야 했다는 것이다. 모두 알다시피 Body 는 한번만 읽을 수 있다. 이유는 HttpServletRequest의 InputStream 은 한번 읽으면 다시 못읽기 때문에. 다시 읽으려고 하면 Exception 파티 일어난다. 고통스럽다... 해결방안을 모색하려고 하던 중 이전에 팀장님께서 팀 슬랙에 Request Body를 로깅하는 포스트를 공유하신적이 있다. 거기에서 인..
일하면서 요청이 들어오면 처리 후 응답을 해주는게 아니라 비동기적으로 선 응답 후 이벤트로 결과를 알려주는 방식으로 구현해야 하는 일이 생겼다. 비동기 응답에 대해서 생 자바부터 스프링 async 까지 한번씩 건들여봤다. 1. 직접 쓰레드를 새로 생성하는 방법 당장 생각나는 방법은 가장 무식한 방법. 컨트롤러에서 요청을 받았을 때 비즈니스 로직이 구현된 서비스를 호출하지 않고 중간에 대신 실행해주는 서비스를 호출하는 방식. 대행하는 서비스는 쓰레드를 생성해 비즈니스 로직이 구현된 서비스를 호출한다. @Slf4j @Service public class ServiceTest { public void getTest() { try { Thread.sleep(5000); // 명확한 확인을 위해 5초 sleep을..
겉으로 보기엔 둘이 하는게 비슷해 보이지만 애초에 위치가 다르다. Filter DispatcherServlet 앞단에서 DispatcherServlet에 요청이 가기전에 정보 처리 J2EE 표준 스펙에 정의되어 있는 기능 메소드 실행 시점 init() : 필터 인스턴스 초기화시점에 실행 doFilter() : 전/후 처리 destory() : 필터 인스턴스 종료시 실행 Interceptor DispatcherServlet에서 Handler(Controller)로 가기전에 정보 처리 SpringFramework에서 자체적으로 제공하는 기능 메소드 실행 시점 preHandle() : 컨트롤러 들어가기 전에 실행 postHandle() : 컨트롤러에 들어갔다가 나온 후 뷰로 보내지기 전에 실행 afterCom..
프로파일에 따라 프로퍼티가 다르고, 프로퍼티 파일이 외부에 있는 상황일 수도 있는 상황이 있었다. 단순히 파일을 확인해서 긁어 오거나 @PropertySource 를 지정해도 되겠지만 오늘은 PropertySourcesPlaceholderConfigurer를 써보자. PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer 는 추상 클래스 PlaceholderConfigurerSupport 를 구현한 클래스. PropertySource를 추가하여 @Value 어노테이션의 ${...} 부분에 프로퍼티 값을 주입해준다. Bean 으로 등록해서 사용하며, PropertySource 를 여러개 등록할 수 있다. 프로퍼티가 겹칠 땐 먼저 ..
영속성 컨텍스트(Persistence Context) 엔티티를 저장한다. Entity Manager를 생성할 때 만들어진다. Entity Manager로 entity를 저장(persist()), 조회(find(), JPQL, QueryDSL)하면 엔티티 매니저는 이 엔티티를 영속성 컨텍스트에 보관 및 관리. 엔티티 식별은 @Id 필드로 한다. 쓰기 지연(영속성 컨텍스트 내부의 SQL 저장소에 쿼리를 저장해뒀다가 엔티티 매니저 commit 메소드 호출 시 DB에 반영(=flush)). 참고) entity lifecycle 비영속 엔티티가 영속성 컨텍스트와 관련이 없는 상태. 생성되기만한 엔티티. 영속(managed) 영속성 컨텍스트에 엔티티가 저장된 상태. persist, find 호출 시. 준영속(det..
보통 프로퍼티 로딩시에 @PropertySource를 많이 사용하고 있었다. 이번에도 똑같이 사용했었는데 적용이 안됬다. 한참을 삽질하다가 아무리 생각해도 이상해서 찾아본 결과...우선 순위가 존재한다. 나중에 또 헤매지 않게 적어둬야지. 나의 경우에는 시스템 프로퍼티가 이미 지정되어 있어서 @PropertySource가 안먹혔던거였나보다... 1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties 2. 테스트에 있는 @TestPropertySource 3. @SpringBootTest 애노테이션의 properties 애트리뷰트 4. 커맨드 라인 아규먼트 5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로퍼티) 에 들어있는 프로퍼티 6. Ser..
@GeneratedValue의 strategy 속성에 명시(ex : @GeneratedValue(strategy = GenerationType.IDENTITY)) IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 방법 (데이터베이스에 의존적) - 주로 MySQL, PostgresSQL, SQL Server, DB2에서 사용. - 예를 들어, mysql은 auto_increment를 사용하여 기본키 생성. SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당하는 방법 (데이터베이스에 의존적) - 주로 시퀀스를 지원하는 Oracle, PostgresSQL, DB2, H2에서 사용. - @SequenceGenerator를 사용하여 시퀀스 생성기를 등록하고, 실제 데이터베이스의 생성될 시퀀..
저번에 팀원 한분이 물어보고 다니길래 나도 헷갈려서 정리. jar에서 ear로 갈수록 단위가 크다. jar (java archive) 하나의 application 기능이 가능하도록 java파일 등을 압축하고 지원. 라이브러리, 리소스, property 파일들을 포함한다. JDK에서 제공하는 Java Archive Tool을 이용하여 jar 파일에 대한 작업을 할 수 있다. (Jar tool) path 등의 경로를 유지하기 때문에 배포된 jar 파일을 사용하는 사용자들은 각 파일들에 대한 path 문제 신경 X. war (web archive) jar와 달리 웹 어플리케이션을 지원하기 위한 압축방식. Web container는 서블릿, jar파일과 WEB-INF폴더에 있는 web.xml 파일을 가지고 있는..