전체 글 779

[ SpringBoot ] 09. AOP를 활용한 REST API의 Error Handling

AOP를 활용한 REST API의 Error Handling SpringBoot에서 기본적으로 오류처리에 대한 동작 흐름에 대해 알아보자. SpringBoot는 모든 오류를 적절한 방식으로 처리하며 /error로 매핑하는 전역 오류 페이지 등록을 제공한다. 또, http 상태와 예외에 대한 메시지를 JSON으로 응답하거나 html 형식으로 렌더링 하는 whitelabel 페이지 뷰를 제공한다. BasicErrorController SpringBoot의 기본 오류 처리 SpringBoot는 오류가 발생하면 server.error.path에 설정된 경로에서 요청을 처리하게 된다. 기본적으로 BasicErrorController가 등록이 되어 있어서 해당 요청을 처리하게 된다. @Controller @Requ..

[ Java ] 22. 자바의 오류와 예외처리에 대해서

자바의 예외에 대해서 > Java 에서의 3가지 Exception Check Exception Error 에러는 자바 프로그램 밖에서 발생한 예외를 말합니다. 그 예로, 서버의 디스크가 고장났다던지 메인보드가 나가서 자바 프로그램이 동작하지 않는다던지가 이에 속합니다. Exception.class는 에러가 아닙니다. 자바에서 Error로 끝나면 에러이고, Exception으로 끝나면 예외이다. Error와 Exception으로 끝나는 오류의 가장 큰 차이는 프로그램 밖에서 발생했는지(Error), 안에서 발생했는지(Exception)의 여부입니다. 더 큰 차이는 프로그램이 멈추어 버리느냐(Error : 프로세스에 영향), 계속 실행할 수 있느냐의 차이(Exception : 쓰레드에 영향)입니다. Runt..

[ Java ] 21. Optional Class

Optional Class 먼저 Optional Class는 값이 존재하는지 여부를 명시적으로 체크하기 위해서 등장하였다. Optional 클래스는 Integer나 Double 클래스 처럼 T 타입의 객체를 포장해주는 래퍼 클래스(Wrapper Class)이다. 따라서 Optional의 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. 메소드 실행 시 반환하는 값을 알 수 없을 때 혹은 그 값이 존재하지 않는 경우에 Optional Class는 매우 유용하게 사용될 것이다. 자바에서는 이 컨셉을 특정 값(null을 포함할 수 있는)을 담는 컨테이너 객체를 Optional로 표현했다. Optional의 인스턴스는 불변 인스턴스이며 hashCode, equals, toString 메서드는 인스턴스 상태(..

[ Spring Data JPA ] 02. Transaction Commit은 어디에서 일어날까?

트랜잭션 커밋은 어디에서 일어날까? 레파지토리를 만들 때 Spring-Data-Jpa의 JpaRepository 인터페이스를 상속하였는데, 스프링 데이터에서 기본 구현체를 제공해주기 때문이다. Spring-Data-Jpa에서 제공하는 JpaRepository의 기본 구현체는 SimpleJpaRepository이다. (CrudRepository는 단순히 인터페이스이다.) SimpleJpaRepository의 save()메소드에는 스프링 @Transactional이 붙어있으므로 해당 클래스에 있는 수많은 메소드에 트랜잭션이 걸리게 되고, 메소드 성공적으로 return하게 되면 commit도 이루어지게 되는것이다. @Transactional public S save(S entity) { Assert.notNu..

[ Spring Data JPA ] 01. JpaRepository 사용하기

JpaRepository Spring-Data-Jpa에서는 반복되는 코드없이 쉽게 JPA Repository를 만들 수 있다. extends JpaRespository으로 인터페이스를 상속하고 커스텀이 필요한 메소드는 오버라이딩하면 된다. 스프링의 변경감지는 EntityManger별로 수행한다. 같은 쓰레드에서 Spring-Data가 제공하는 Repository들은 하나의 EntityManager를 공유한다. 그래서 하나의 컨테이너에서 여러 Repository가 사용하는 EntityManager는 동일하다.

[ Spring Data JPA ] 00. Entity와 EntityManager

Entity에 관하여 엔티티 클래스는 테이블과 매핑되어 사용되는 클래스이다. @Entity 어노테이션으로 JPA에게 테이블과 매핑될 클래스이니 관리 할 것임을 알리고 @Table(name = 'product')로 DB와 매핑될 테이블 네임을 지정한다. class name과 table name이 같다면 생략해도 된다. @Column(name = 'id')도 마찬가지로 DB의 컬럼과 매핑될 필드로 name이 같다면 생략해도 된다. ++ 일반적으로 id를 Long타입의 래퍼클래스로 받는 이유? : long값의 경우 기본값으로 0이 데이터베이스에 들어갈 수 있는데, 기존 데이터베이스에도 id가 0값으로 들어있다면 이게 기존데이터인지 추가된 데이터인지 구분이 어렵다. 따라서, Long타입으로 하면 null로 들어..

[ SpringBoot ] 08. Method Lookup Injection In Spring

Method Injection 생명주기가 다른 두 빈에 대한 작업을 할 때 사용하는 Injection 방법 Singleton Bean이 Prototype Bean의 참조를 가지고 있어서 Prototype이어야 하는 객체가 싱글톤으로 동작하는 문제를 해결하기 위해 생겨난 것 위와 같은 경우에 Spring은 singleton 객체를 리턴할 때 최초 한번 생성된 bean의 인스턴스를 계속해서 리턴하게 되는데 위와 같이 정의된 경우에는 singleBean은 singleton 패턴으로 초기 생성 이후 소멸하지 않기 때문에 singleBean 내부에 가지고 있는 someBean 역시 최초에 만들어지고, 다시 만들어지지 않게 되는 현상이 발생한다. 나는 someBean을 prototype으로 사용하고 싶다고!! 사실..

[ SpringBoot ] 07. RestTemplate을 알아보자

RestTemplate Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿 (server to servet) RESTful의 원칙을 지킬 수 있으며 HTTP 메소드들에 적합한 여러 메소드가 제공됨 HTTP 요청 후 JSON, XML, string과 같이 응답을 받을 수 있는 템플릿 (그게 아니라면 직접 라이브러리로 파싱해야함) Blocking I/O 기반의 동기방식을 사용(REST API 호출 후 응답을 받을 때까지 기다린다) Header와 Content-Type을 설정해서 외부 API 호출 가능 단순 메소드 호출 만으로 복잡한 작업을 쉽게 처리 가능 HttpClient : HTTP를 사용해 통신하는 범용 라이브러리로 RestTemplate은 HttpClient를 추상화 해서 제공한다. ..

[ SpringBoot ] 06. ResponseEntity에 관하여

ResponseEntity 먼저 Spring framework에 HttpEntity라는 클래스가 존재한다. 이 클래스는 HTTP 요청(request)이나 응답(response)에 해당하는 HttpHeader와 HttpBody를 포함하는 클래스이다. public class HttpEntity { private final HttpHeaders = headers; @Nullable private final T body; } public class RequestEntity extends HttpEntity public class ResponseEntity extends HttpEntity RequestEntity와 ResponseEntity는 이렇게 HttpEntity 클래스를 상속받아 구현한 클래스이다. Re..

[ SpringBoot ] 05. RestController가 뭐죠?

RestController 전통적인 Spring MVC에서의 @Controller는 주로 View를 반환하기 위한 용도로 사용되었다. MVC 컨테이너는 Client의 요청으로부터 View를 반환한다. Spring MVC의 @Controller에서 데이터를 반환하기 위해서는 컨트롤러의 각 메소드에 @ResponseBody 어노테이션을 사용하면 JSON 형태로 데이터를 반환할 수 있다. 이 때 ViewResolver를 통해 데이터를 담을 View를 찾는 과정을 거치게 된다. Spring 4.0에서 Spring 프레임워크에서 RESTful 웹 서비스를 쉽게 개발할 수 있도록 @RestController라는 것이 추가됨. RestController는 @Controller와 @ResponseBody의 조합으로 단..

[ SpringBoot ] 04. Lombok 라이브러리

Lombok Lombok은 자바의 반복 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다. 보통 DTO, Model, Entity의 경우 여러 속성이 존재하고 이들의 프로퍼티에 대해서 Getter, Setter, 생성자 등 매번 작성해줘야 하는 부분을 자동으로 만들어주는 라이브러리이다. 코딩과정에서는 어노테이션만 보이지만, 실제 컴파일된 .class 파일에는 연관 코드들이 생성되어 있게 된다. 귀찮은 과정을 줄여주고 반복되는 코드작성을 대신하기 때문에 많은 개발자들이 사용하고 있지만 호불호가 갈리는 라이브러리이기도 하며, 개별 작동방식을 잘 알고 사용하는 것이 좋다. @Getter, @Setter @Getter와 @Setter를 클래스 이름 위에 적용 시키면 모든 non-static 변수들에 대한..

[ SpringBoot ] 03. Spring의 Bean Scope를 알아보자

Bean Scope Bean을 정의할 때 해당 빈에 정의된 클래스의 실제 인스턴스를 생성하기 위한 방법을 생성한다. 단일 레시피로 많은 객체 인스턴스를 만들 수 있기 때문에 Bean Definition에 관한 개념은 매우 중요하다. 스프링은 기본적으로 모든 Bean을 Singleton으로 생성해 관리한다. 구체적으로는 애플리케이션 구동시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미하고, 우리는 스프링을 통해서 bean을 제공받으면 주입 받은 bean은 언제나 동일한 객체임을 가정하고 개발한다. 특정 Bean Definition에서 생성된 객체에 연결될 다양한 종속성과 구성을 제어할 수 있을 뿐만 아니라, 특정 Bean Definition에서 생성된 객체의 범위도 제어할 수 있다...

[ SpringBoot ] 02. Spring의 Autowiring과 Qualifer

Autowiring IoC 컨테이너에 등록된 빈을 어떻게 꺼내서 사용할 것인가 ? 스프링에는 다양한 의존성 주입 방법이 있는데, 생성자로 직접 주입을 받아도 되지만 @Autowired를 사용하면 IoC 컨테이너에 들어있는 Bean을 주입받아서 사용할 수 있다. 스프링 컨테이너는 협력관계에 있는 빈들에 대해서 자동으로 관계를 주입한다. ApplicationContext의 내용을 조사한 뒤에 Spring이 빈에 대해서 자동으로 다른 연관관계 빈에 대해서 의존성을 주입할 수 있도록 할 수 있다. Autowire을 사용하면 다음과 같은 이점을 가진다. 특정 프로퍼티나 생성자의 argument를 지정할 필요성을 크게 줄일 수 있다. 클래스가 발전함에 따라서 구성의 업데이트를 쉽게 할 수 있다. 이 말은, 클래스에..

[ SpringBoot ] 01. Spring Bean의 LifeCycle

Spring Bean LifeCycle Spring Bean이라고 하는 것은 일반적으로 객체인데, IoC 컨테이너가 관리하는 객체를 Bean이라고 한다. ( new로 만드는 객체는 Bean이 아니다 ) 대략적으로 스프링 빈의 life cycle은 아래와 같다. # 객체 생성 > 의존 설정 > 초기화 > 소멸 단계 스프링 컨테이너를 초기화 할 때 스프링 컨테이너는 빈 객체를 생성하게 되고 이 시점에 DI를 통한 의존성이 주입된다. 모든 의존 설정이 완료되면 빈 객체를 초기화 하기 위해서 스프링은 빈 객체의 지정된 메서드를 호출하게 된다. 마지막으로 스프링 컨테이너가 close() 메서드로 종료될 시점에 컨테이너는 빈 객체의 소멸을 처리하고 이때도 지정된 메서드를 호출하게 된다. 그럼 어떻게 Spring C..

[ SpringBoot] 00. @SpringBootApplication Annotaion

@SpringBootApplication 스프링부트 템플릿을 통해 프로젝트를 생성하면 아래와 같이 자동으로 xxxApplication에 메인메소드가 생성이 된다. @SpringBootApplication public class FileDbWorkApplication { public static void main(String[] args) { SpringApplication.run(FileDbWorkApplication.class, args); } } 그 곳에 @SpringBootApplication이 존재하게 되며 그 안을 확인해보면 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBo..