본문 바로가기

Spring

Springframework AOP란? AOP란? Aspect Oriented Programing의 약자로 관점 지향 프로그래밍을 의미한다. AOP와 관련된 용어들은 다음과 같다. 조인포인트(JoinPoint) 클라이언트가 호출한 모든 비즈니스 메소드를 조인포인트라고 하며, 포인트컷 대상 혹은 포인트 컷 후보라고 하는데 이는 조인포인트에서 포인트컷이 선택되기 때문이다. 포인트컷(PointCut) 필터링 된 조인포인트를 의미한다. 어드바이스(Advice) 어드바이스는 횡단관심에 해당하는 공통 기능의 코드를 의미하며, 독립된 클래스의 메소드로 작성된다. before, after, after-returning, after-throwing, around 등 다섯 가지의 구체적인 동작시점이 있다. 위빙(Weaving) 포인트컷으로 지정한 핵심 관심 메.. 더보기
Spring log4j 라이브러리란? log4j란? log4j는 자바기반의 로깅 유틸리티이며 Apache에서 만든 오픈소스 라이브러리이다. log4j는 옵션 설정을 통해서 선택적으로 로그를 남기거나 특정파일에 로그를 생성하는 다양한 이점이 존재한다. log4j Level FATAL 아주 심각한 에러가 발생한 상태를 나타냄 ERROR 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타냄 WARN 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄 INFO 어떠한 상태변경과 같은 정보성 메시지를 나타냄 DEBUG 개발 시 디버그 용도로 사용하는 메시지를 나타냄 TRACE 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀더 상세한 이벤트를 나타냄 출력 레벨 설정에 따라 설정 레벨 이상의 로그가 .. 더보기
Springframework version 마이그레이션하는 방법 기본 환경 Spring Framework 3.1.1 java version 1.6 Maven compiler source 1.6, target 1.6 servlet-api 2.5 jsp-api 2.1 변경할 환경 Spring Framework 4.3.4 java version 1.8 Mave compiler source 1.8, target 1.8 servlet-api 3.0 jsp-api 2.2 설정을 변경하기 위해 pom.xml을 수정해야한다. 1. java version 1.6 → 1.8, Spring Framework 3.1.1 → 4.3.4으로 변경 1.8 4.3.4.RELEASE 1.6.10 1.6.6 2. Servlet api 버전을 2.5 → 3.0.1으로 변경(artifactId의 경우 .. 더보기
SELECT 문으로 데이터 랜덤으로 가져올 경우에 대한 성능 테스트 SELECT문으로 데이터를 가져올 때 랜덤으로 순서가 바뀌어야하는 요구사항이 존재하였습니다. 해당 기능을 구현하기 위해서 2가지 방안을 생각했었습니다. 1. DBMS에서 ORDER BY RANDOM()를 통해 랜덤하게 가져오도록 개발 2. SELECT 문으로 데이터를 가져온 후 웹 애플리케이션단에서 랜덤하게 순서변경 로직 개발 1번째 방안으로 개발을 진행한 후 성능테스트 이후 성능저하가 심할경우 2번째 방안으로 개발하도록 계획을 수립하였습니다. 쿼리문 select receiver_key, user_id, amount, is_received from tb_receiver where token = #{value} select receiver_key, user_id, amount, is_received fro.. 더보기
Mybatis에서 대량의 데이터를 넣을 때 bulk insert를 사용하자 개발을 하다보면 API 호출 시 1000건이상의 데이터를 삽입해야하는 상황이 있습니다. 1000건의 데이터를 insert하는데 걸리는 시간은 약 5초였으며 시간을 줄일 수 있는 방안을 생각해봤는데요. mybatis에서 대량의 데이터를 한번에 삽입할 수 있도록 insert foreach문(DBMS마다 지원하는 쿼리가 다름)을 지원하는 것을 알게 되었습니다. 수정 전 SQL insert into tb_receiver(receiver_key, token, user_id, amount, is_received, receiver_date) values(#{receiver_key}, #{token}, #{user_id}, #{amount}, #{is_received}, #{receiver_date}) 수정 후 SQL.. 더보기
멀티 스레드 환경에서 동일 데이터에 대해서 업데이트 시 고려해야 할 사항 어느 회사의 과제 코드리뷰 중 면접관으로부터 상황이 부여되어 해결책을 제시하라는 질문을 받았습니다. 문제사항 1. 두명의 사용자가 A라는 API를 동시에 호출할 경우가 발생할 수 있다. 2. A라는 API의 로직 중 데이터를 가져오는 SELECT 문까지 동시에 접근하였다. 3. 우연한 일치로 API 내에서 수정되어야 하는 데이터가 동일하다. 이럴경우 어떻게 해결하겠는가? 너무 많이 당황하고 해결책을 생각하지 못했다. 어떻게 이 문제를 해결해야 할지 생각해봤는데 간단히 해결할 수 있었다. 해결 1. SQL 변경 2. 정해진 횟수만큼 시도하여 모두 실패할 경우 예외발생 현재의 SQL문은 업데이트문으로써 업데이트문에 대한 조건만이 존재 업데이트문에 대한 조건을 상세히 하여 업데이트 셀렉트 구문으로 변경 수정된.. 더보기
@Service, @Controller, @Repository 과 @Component의 차이는? @Component를 구현한 @Service, @Repository, @Controller에 대해서 @Component의 차이는 무엇인지 왜 @Component만 사용하면 안되는지 의문점이 생겨 알아보았는데요. @Repository Spring에서 지원하지 않은 Exception을 Spring Exception으로 전환하기 위해서는 @Repository 애노테이션을 사용해야합니다. @Repository 애노테이션이 적용된 메소드에서 Exception이 발생할 경우 UnChecked Exception인 DataAccessException으로 전환시킨다고 합니다. ex) 선언적 트랜잭션을 적용한 메소드에서 DB관련된 오류가 발생해도 롤백이 가능한 이유 CheckedException, UnCheckedExce.. 더보기