@RestControllerAdivce vs @Around("within(@org.springframework.web.bind.annotation.RestController *)")
·
Spring
Trouble shooting프로젝트에서 에러코드가 자꾸 500번대로 나가는 이슈가 발생했다. 현재 프로젝트는 ResponseEntityExceptionHandler(관점지향 - 역할과 책임의 분리)를 상속해 예외처리를 하고 있는 상태였다. 분명 RunTimeException을 상속해 GeneralException을 만들어 커스텀 예외를 처리하게끔 했는데도 이 ExceptionHandler에서 처리가 되고 있는 것을 확인할 수 있었다. 물론 RuntimeException을 GeneralExcetion 상속하고 있긴하지만 분명히 더 구체적인 하위 클래스부터 처리가 된다고 알고 있었기 때문에 이는 문제가 아니라고 생각했다.해결 디버깅 모드로 돌려보니 로깅을 위해 사용하던 LoggingAspect 클래스에서 ..
연관관계 (단방향과 양방향) 정리
·
Spring
데이터베이스의 설계는 쉽지 않다. 데이터를 객체로 사용하는 spring에서도 고려를 하며 관계를 설계 해야한다. 일반적으로 데이터 베이스는 PK를 가진 테이블을 설계하고 PK키를 FK로 갖는 테이블을 나중에 설계한다. 하지만 JPA는 방향성을 결정하는 것조차 어렵다.예를 들어 아래와 같은 테이블이 두개 존재한다고 가정하자. 회원id(PK)Longnamevarcharpasswordvarcharcreated_atDATETIMEmodified_atDATETIME 게시물id(PK)Longtitlevarcharwriter_id(FK)Longcontentsvarcharcreated_atDATETIME 게시물은 작성자의 id를 FK로 가지고 있다. 그러면 회원 객체가 게시물을 참조하는 것일까? 아니면 게시물들이 회원..
싱글톤 (프로토타입과 스코프)
·
Spring
스프링에서 싱글톤이라는 용어를 흔히 사용합니다. 싱글톤 패턴이란 말그대로 하나만 사용한다고 보시면 됩니다. 추상적이라 생각하실 수 있기에 바로 싱글톤에 대해 알아보겠습니다. 그리고 관련된 프로토타입과 스코프까지 설명해보겠습니다. 싱글톤과 빈 기본적으로 스프링의 빈은 싱글톤으로 만들어집니다. 애플리케이션 컨텍스트마다 빈의 오브젝트는 한 개만 만들어진다는 의미와 같습니다. 스프링에서 이와 같이 빈을 사용하는 이유는 사용자의 요청이 있을 때마다 매번 애플리케이션 로직을 담은 오브젝트를 새로 만드는 건 비효율적이기 때문입니다. 그렇기에 하나의 빈 오브젝트에 동시에 여러 스레드가 접근하는 구조가 됩니다. 이러한 구조에서 고려해야 할 점은 동기화입니다. 멀티쓰레드 환경에서 공유 자원에 경우 해당하는 문제점입니다. ..
IoC 컨테이너란 무엇인가
·
Spring
스프링을 처음 접하게 된다면 IoC 컨테이너에 대한 개념을 이해하고 학습을 진행하는 것이 중요하다고 생각합니다. 스프링의 핵심 기술중 하나로 중요도가 매우 높기 때문입니다. 또한 DI를 이해하기 위해서는 IoC 컨테이너가 선행되어야 합니다. 그래서 이번 글에 IoC 컨테이너에 대해 다루어 보겠습니다. IoC 컨테이너 IoC 컨테이너의 다양한 기능중 가장 기본적인 기능과 역할은 코드를 대신해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리하는 것입니다. 이러한 오브젝트들을 우리는 빈이라고 부릅니다. 이러한 빈들을 컨테이너가 만들고 관리하게 하는 것이 DI를 비롯한 스프링의 주요 기술을 적용하기 위한 조건이 됩니다. 기본적으로 프레임 워크란 프로그램 흐름의 제어를 개발자가 아닌 프레임 워크에게 맡겨 주요 ..
어노테이션이란?
·
Spring
스프링을 사용하여 개발할 때에 @GetMapping, @PostMapping과 같은 어노테이션을 자주 사용하고 볼수 있었습니다. 저는 어떤 상황에서 어떤 어노테이션을 사용해야 하는지 알뿐 왜 사용해야 하고 어노테이션이 어떻게 만들어지는 지는 알지 못하고 사용하였습니다. 한번쯤 관련된 내용을 정리하고자 하여 글을 작성하게 되었습니다. 어노테이션의 등장 기존의 스프링 프레임워크는 IoC를 위하여 xml과 같은 파일을 이용하여 메타정보를 저장하고 이를 활용하여 프로그램을 제어하였습니다. IoC : '제어의 역전'으로 프로그램의 객체 생성, 흐름, 소멸등을 프레임워크에게 권한을 주어 제어할 수 있도록 하는 것을 의미한다. 예를 들어 인터페이스 타입으로 선언한후 프레임워크가 런타임때 적절한 타깃의 타입을 객체로 ..
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법)
·
Spring
@트랜잭션 정책 스프링에서는 @Transactional 어노테이션을 통해 포인트 컷과 트랜잭션 속성을 지정할 수 있도록 도와줍니다. 포인트 컷이란? : 공통기능을 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈 스프링은 @Transactional 어노테이션을 적용할 때 타킷 메소드, 타깃 클래스, 선언 메소드, 선언 타입(클래스, 인터페이스)의 순서에 따라서 적용되어 있는지 차례로 확인하고 가장 먼저 발견되는 속성정보를 사용하게 합니다. 예를 들어 위와 같은 인터페이스와 클래스가 존재할때에 앞서 말한바와 같이 우선순위는 타깃 메소드>타깃 클래스>선언 메소드>선언 타입 이기에 ServiceImpl 클래스에 있는 메소드에 @Transactional이 가장 먼저 적용된후, ServiceImpl..
Mockito 프레임워크 정리(TDD 작성, 테스트 코드 작성)
·
Spring
테스트를 먼저 만들어둔 후 코드를 작성하는 것을 TDD라고 부릅니다. 이렇게 테스트 코드를 먼저 작성해 둔 후 코드를 작성하면 다양한 예외 상황을 고려하고 완전하고 보다 쉽게 코드를 작성할 수 있습니다. 그만큼 테스트 코드는 중요하기에 코드를 작성하면서 테스트는 어떻게 만들 수 있을까를 생각해보는 것은 좋은 습관입니다. 테스트는 단위 테스트와 통합 테스트로 나눌 수 있습니다. 단위테스트는 말그대로 하나의 단위에 초점 맞춘 테스트입니다. 이런 하나의 단위를 테스트 하기위해서 테스트 코드를 작성하다 보면 여러 클래스와 메소드가 의존관계에 얽혀 불필요한 의존 오브젝트를 생성하고 사용하는 경우가 많았습니다. 이러한 번거로운 작업을 없애주기 위해 나온것이 Mockito 프레임워크입니다. 사용방법 1. 인터페이스를..
JAVA Mail을 이용한 메일 발송
·
Spring
서버를 만들다 보면 메일을 인증하거나, 안내 메일을 전송하는 로직이 필요한 경우가 종종 있습니다. 자바에서 메일을 발송할 때는 JavaMail을 사용하면 됩니다. javax.mail 패키지에서 제공하는 자바의 이메일 클래스를 사용하면 다음과 같은 메일 발송 메소드를 만들 수 있습니다. private void sendUpgradeEMail(User user) { Properites props = new Properties(); props.put("mail.smtp.host", "mail.ksug.org"); Session s = Session.getInstance(props, null); MimeMessage message = new MimeMessage(s); try { message.setFrom(ne..
트랜잭션
·
Spring
sql문을 실행했을 때에 몇가지의 로우만 삭제되고 나머지는 안되거나, 일부만 수정되고 나머지 필드는 수정이 안된 채로 실패로 끝나는 경우는 없습니다. 이는 데이터베이스의 ACID 성질을 만족하는 것입니다. 서버에서도 이러한 성질을 요구하는 경우가 있습니다. 계좌이체 작업같은 경우 입금 계좌와 출금 계좌의 변동 총량은 반드시 같아야 하며 이를 보장해줘야 합니다. 하지만 DB의 출금계좌의 상태를 수정하는 것과 입금계좌의 상태를 수정하는 것은 두개의 sql문이 필요합니다. 이렇게 한번에 실행을 보장하는 작업을 트랜잭션이라 말합니다. 앞서 계좌이체 작업 또한 하나의 트랜잭션이 됩니다. 트랜잭션 롤백 : 트랜잭션 안에 한가지의 작업이라도 실패했을 경우 앞서 성공한 작업들 모두 취소하는 작업. 트랜잭션 커밋 : 트..
돌_멩
'Spring' 카테고리의 글 목록