웹 프로그래밍 56

[ 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..

[ Spring ] 13. Spring의 JDBC

JDBC JDBC는 자바에서 DB를 활용할 수 있도록 지원하는 API이다. 데이터 베이스 테이블과, 자바 객체 사이의 단순한 매핑을 간단한 설정을 통해 처리한다. 기존의 JDBC에서는 구현하고 싶은 로직마다 필요한 SQL문이 모두 달랐고, 이에 필요한 Connection, PrepareStatement, ResultSet 등을 생성하고 Exception 처리도 모두 해야 하는 번거로움이 존재했다. 때문에 Spring에서는 JDBC와 ORM 프레임워크를 직접 지원하기 때문에 따로 작성하지 않아도 모두 다 처리해주는 장점이 있다. (Spring-JDBC) 여기서는 Spring JDBC에 대해서 알아본다. DataSource란? DataSource는 JDBC 명세의 일부분이면서 일반화된 연결 팩토리이다. 즉,..

[ Spring ] 12. DAO & DTO & Entity와 스프링 패키지의 전체 구조

DAO & DTO & Entity DAO Data Access Object repository package 실제로 DB에 접근하는 객체 Persistance Layer(DB에 dat를 CRUD하는 계층)이다. Service와 DB를 연결하는 고리의 역할 SQL을 사용해 (개발자가 직접 코딩) DB에 접근한 후 적절한 CRUD API를 제공한다. JPA 대부분의 기본적인 CRUD method를 제공하고 있다. extends JpaRepository public interface QuestionRepository extends CrudRepository { } "Object" 단위 -> (SQL을 이용한 CURD) -> DB의 "Record" 단위로 저장 되는 순서 Obejct와 Record 간의 miss..

[ Spring ] 11. Spring에서의 Annotation

Annotation 소스코드에 @어노테이션의 형태로 표현하며, 클래스, 필드, 메소드의 선언부에 적용할 수 있는 특정기능이 부여된 표현법 애플리케이션의 규모가 커질수록, xml환결설정이 매우 복잡해지는데 , 이를 개선하기 위해 자바 파일에 어노테이션을 적용해서 개발자가 설정 파일 작업을 할때 발생시키는 오류를 최소화해주는 역할을 한다. 어노테이션의 사용으로 소스 코드에 메타데이터를 보관할 수 있고, 컴파일 타임의 체크 뿐 아니라 어노테이션 API를 사용해 코드 가독성도 높여줄 수 있다. @Controller : Dispatcher-Servlet.xml에서 bean 태그로 정의하는 것과 같은 역할 @RequestMapping : 특정 메소드에서 요청되는 URL과 매칭시키는 어노테이션 @Autowired :..

[ Spring ] 10. AOP(Aspect Oriented Programming)

AOP Aspect Oriented Programming (측면/양상 지향적 프로그래밍) " 공통의 관심사항을 적용해서 발생하는 의존 관계의 복잡성과 코드 중복을 해소 " 즉, 여러군데서 사용되는 중복되는 코드를 떼어내서 분리하고 각 메소드는 자신이 해야할 작업만 갖고 있자는 개념이다. 여기서 여러군데서 사용되는 중복되는 코드(부가 기능)가 AOP에서 말하는 Aspect이다. 각 클래스에서 공통 관심 사항을 구현한 모듈에 대한 의존관계를 갖기 보단, Aspect를 이용해 핵심 로직을 구현한 각 클래스에 공통 기능을 적용한다. 간단한 설정만으로도 공통 기능을 여러 클래스에 적용할 수 있는 장점이 있으며 핵심 로직 코드를 수정하지 않고도 웹 애플리케이션의 보안, 로깅, 트랜잭션과 같은 공통 관심사항을 AOP..

[ Spring ] 09. DI (의존성 주입)

DI 의존관계 주입 스프링 컨테이너가 지원하는 핵심 개념중 하나로, 설정파일을 통해 객체간의 의존관계를 설정 이는, 스프링에서만 사용되는 용어가 아니라 객체지향 프로그래밍에서 통용되는 개념이다. 강한 결합 객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조이다. A클래스 내부에서 B라는 객체를 직접 생성하고 있다면, B객체를 C객체로 바꾸고 싶은 경우, A클래스도 수정해야 하는 방식이고, 이를 강한결합이라 한다. 느슨한 결합 객체를 주입받는 다는 것은 외부에서 생성된 객체를 인터페이스를 통해 넘겨받는 것이다. 이렇게하면 결합도를 낮출수 있고, 런타임 시에 의존관계가 결정되기 때문에 유연한 구조를 가진다. SOLID의 원칙 중 O에 해당하는 Open Closed Principle을 지키기 ..

[ Spring ] 08. Component Scan

Component Scan xml 설정파일에 서 모든 빈을 으로 일일이 등록해줘야 하는 것은 매우 번거로운 일이다 그래서 등장한것이 Component Scan이다. test.xml 위와 같이 내부 filter 태그가 없다면, base-package에 지정한 패키지에서부터 모든 하위 패키지를 scanning해서 빈을 등록하도록 한다. 모든 클래스를 빈으로 등록하는 것은 아니고, @Component Annotation이 붙은 클래스를 빈으로 등록한다. ApplicationContext.xml Servlet-Context.xml 위를 보면 Servlet-Context.xml 설정 시, use-default-filters 속성을 false로 처리 하였다. use-default-filters 속성은 원래 defa..