일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- pandas
- HashMap
- 완전 탐색
- 쿼드압축 후 개수세기
- Stack
- 메뉴리뉴얼
- 순열
- 2017 카카오 코드
- Java
- 반복문
- 후위 표기법
- dfs
- 튜플
- 영문자 확인
- 프로그래머스
- 조합
- fragment identifier
- Dynamic Programming
- 보이어무어
- 점프와 순간이동
- HashSet
- 에라토스테네스의 체
- 어려웠던 문제
- 동적계획법
- 규칙찾기
- 알고리즘
- 문자열
- python
- 최소공배수
- 완전탐색
- Today
- Total
csmoon1010의 SW 블로그
Spring Core - (부스트코스) 본문
1. 스프링 프레임워크(Spring Framework) 개요
1) 프레임워크
- 반제품 : 이미 중요한, 복잡한 부분이 구현된 것들을 가지고 프로그래밍할 수 있도록 함
2) 스프링 프레임워크란?
- 엔터프라이즈급 어플리케이션을 구축할 수 있는 가벼운 솔루션이자, 원스-스탑-숍(One-Stop-Shop)
**One-Stop-Shop : 모든 과정을 한번에 해결하는 상점 - 모듈화 : 원하는 부분만 가져다 사용할 수 있음 - 약 20개의 모듈 제공
- IoC 컨테이너
- 선언적으로 트랜잭션을 관리
- 완전한 기능을 갖춘 MVC Framework 제공
- AOP 지원
- 도메인 논리 코드와 쉽게 분리될 수 있는 구조
3) 스프링 프레임워크 모듈
(1) AOP와 인스트루멘테이션(Instrumentation) _ 여기서 다루지 않음
- spring-AOP : AOP 얼라이언스(Alliance)와 호환되는 방법으로 AOP를 지원
- spring-aspects : AspectJ와의 통합을 제공
- spring-instrument : 인스트루멘테이션을 지원하는 클래스와 특정 WAS에서 사용하는 클래스로 더 구현체를 제공
(※ 참고 : BCI(Byte Code Instrumentations) - 런타임이나 로드(Load) 때 클래스의 바이트 코드에 변경을 가하는 방법)
(2) 메시징(Messaging) _ 여기서 다루지 않음
- spring-messaging :
스프링 프레임워크 4 - 메시지 기반 어플리케이션을 작성할 수 있는 Message, MessageChannel, MessageHandler 등을 제공
메소드에 메시지를 맵핑하기 위한 어노테이션도 포함 (Spring MVC 어노테이션과 유사)
(3) 데이터 엑세스(Data Access) / 통합(Integration)
JDBC, ORM, OXM, JMS 및 트랜잭션 모듈로 구성됨
- spring-jdbc : 자바 JDBC프로그래밍을 쉽게 할 수 있도록 기능을 제공
- spring-tx : 선언적 트랜잭션 관리를 할 수 있는 기능을 제공
- spring-orm : JPA, JDO및 Hibernate를 포함한 ORM API를 위한 통합 레이어를 제공
- spring-oxm : JAXB, Castor, XMLBeans, JiBX 및 XStream과 같은 Object/XML 맵핑을 지원
- spring-jms : 메시지 생성(producing) 및 사용(consuming)을 위한 기능을 제공, Spring Framework 4.1부터 spring-messaging모듈과의 통합을 제공
(4) 웹(Web)
spring-web, spring-webmvc, spring-websocket, spring-webmvc-portlet 모듈로 구성됨
- spring-web : 멀티 파트 파일 업로드, 서블릿 리스너 등 웹 지향 통합 기능을 제공
HTTP클라이언트와 Spring의 원격 지원을 위한 웹 관련 부분을 제공 - spring-webmvc (= Web-Servlet 모듈) : Spring MVC 및 REST 웹 서비스 구현을 포함
- spring-websocket : 웹 소켓을 지원
- spring-webmvc-portlet : 포틀릿 환경에서 사용할 MVC 구현을 제공
2. 컨테이너 : IoC & DI
1) 컨테이너(Container)
- 인스턴스의 생명주기를 관리
- 생성된 인스턴스에게 추가적인 기능 제공
EX-1> Servlet 컨테이너(WAS) : 개발자가 작성한 서블릿 클래스를 메모리에 올리고 실행
EX-2> JSP 컨테이너(WAS) : JSP를 Servlet으로, Servlet을 인스턴스로 만드는 일
2) IoC (Inversion of Control, 제어의 역전)
- 컨테이너(factory)가 오브젝트의 제어권을 가지고 프로그램을 대신 실행해주는 것
- 통일된 인터페이스를 제공하여 재사용성을 높임
EX> WAS가 서블릿의 메소드를 알맞게 알아서 호출해줌
3) DI (Dependency Injection, 의존성 주입)
- 클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결
- 공장에서 만든 인스턴스를 가져오는 방법
EX> DI의 적용
@Component
class 엔진 {
}
@Component
class 자동차 {
@Autowired
엔진 v5;
}
∴ 개발자 : 약속된 어노테이션들을 이용해 선언 → 컨테이너 : 객체를 생성해 주입 (IoC/DI 성질)
4) Spring의 IoC/DI 컨테이너(factory 역할)
- BeanFactory : IoC/DI에 대한 기본 기능 포함
- ApplicationContext : BeanFactory의 모든 기능 + 트랜잭션처리, AOP등에 대한 처리
- BeanPostProcessor, BeanFactoryPostProcessor등의 자동 등록
- 국제화 처리
- 어플리케이션 이벤트 등을 처리
- BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있음
- BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있음
3. xml 파일을 이용한 설정
- maven 프로젝트 생성
- pom.xml : JDK 1.8 설정
1) IoC (제어의 역전) 구현
- UserBean (Bean 클래스) 생성 : 컨테이너가 대신 생성해줄 것이므로 아래 규칙들을 지켜야
- 기본 생성자를 가지고 있음
- private 필드로 선언
- getter, setter 메소드를 가짐 ___ XXX 프로퍼티(property ) = getXXX(), setXXX() 메소드
package kr.or.connect.diexam01;
//빈클래스
public class UserBean {
//필드는 private한다.
private String name;
private int age;
private boolean male;
//기본생성자를 반드시 가지고 있어야 한다.
public UserBean() {
}
public UserBean(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
// setter, getter메소드는 프로퍼티라고 한다.
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMale() {
return male;
}
public void setMale(boolean male) {
this.male = male;
}
}
- pom.xml : 'spring context' dependecy 추가
- <properties>에 version을 상수로 등록하여 라이브러리 추가의 용이성 확보
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version> 4.3.14.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
- applicationContext.xml (Bean 설정파일) 생성
- src/main/resources에 위치 시킴
- <bean>을 이용해 Bean 클래스를 등록
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userBean" class="kr.or.connect.diexam01.UserBean"></bean>
</beans>
✔ kr.or.connect.diexam01.UserBean userBean = new kr.or.connect.diexam01.UserBean() 을 대신 수행해준다!
- ApplicationContextExam01.java : 설정파일을 읽어들이는 예시 코드
- ClassPathXmlApplicationContext("설정파일 path") : 설정파일로부터 읽어들여 ApplicationContext 인터페이스를 구현
- ac.getBean("객체명")을 통해 생성된 객체를 이용
- 싱글톤 : 생성된 Bean 객체는 메모리에 하나만 생성됨
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam01 {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"classpath:applicationContext.xml");
System.out.println("초기화 완료.");
UserBean userBean = (UserBean)ac.getBean("userBean");
userBean.setName("kim");
System.out.println(userBean.getName());
UserBean userBean2 = (UserBean)ac.getBean("userBean");
if(userBean == userBean2) {
System.out.println("같은 인스턴스이다.");
}
}
}
2) DI (의존성 주입) 구현
- Engine, Car 클래스 (Bean 클래스) 생성
- Car의 run() 메소드에서 엔진의 exec()을 호출하는 구조
- Spring을 사용하지 않는다면, 두 객체를 생성하고 Engine 객체를 파라미터로 받아오는 코드 작성이 필요
(Engine.java)
package kr.or.connect.diexam01;
public class Engine {
public Engine() {
System.out.println("Engine 생성자");
}
public void exec() {
System.out.println("엔진이 동작합니다.");
}
}
(Car.java)
package kr.or.connect.diexam01;
public class Car {
Engine v8;
public Car() {
System.out.println("Car 생성자");
}
public void setEngine(Engine e) {
this.v8 = e;
}
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
}
- applicationContext.xml (Bean 설정파일) 생성
- <property>를 통해 다른 Bean 객체를 참조해 setter를 등록
<bean id = "e" class = "kr.or.connect.diexam01.Engine"/>
<bean id = "c" class = "kr.or.connect.diexam01.Car">
<property name="engine" ref="e"></property>
<!-- setter, getter 중 하나 -> setEngine, getEngine 빈태그 내에서는 값을 설정하는 것이므로 setEngine()일 것-->
<!-- ref : 파라미터로 생성된 빈객체 e를 전달할 것! -->
</bean>
- ApplicationContextExam02.java : 설정파일을 읽어들이는 예시코드
- 직접적으로 사용할 클래스( Car )만 알고 있으면 수행 가능한 장점
- 변형된 클래스의 수행도 설정파일의 수정만으로도 해결 가능
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContext02 {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) ac.getBean("c");
car.run();
}
}
4. Java Config를 이용한 설정
- XML 사용 시 Bean 객체의 등록으로 생기는 불편함을 해소
- Java Config와 어노테이션을 이용
1) @Bean으로 Bean 객체를 직접 등록하는 경우
- ApplicationConfig.java : 스프링 설정 클래스
- @Configuration : 스프링 설정 클래스임을 명시
- @Bean : Bean 객체를 설정하는 메소드 작성
- @Bean이 붙어 있는 메소드들을 자동으로 실행하여 생성한 객체들을 싱글턴으로 관리함
- 파라미터가 없는 생성자의 객체 생성 → 같은 타입의 객체가 있을 경우 파라미터로 전달해서 나머지 생성
package kr.or.connect.diexam01;
import org.springframework.context.annotation.*;
@Configuration
public class ApplicationConfig {
@Bean
public Car car(Engine e) {
Car c = new Car();
c.setEngine(e);
return c;
}
@Bean
public Engine engine() {
return new Engine();
}
}
- ApplicationContextExam03.java : 설정 클래스를 읽어들이는 예시코드
- AnnotationConfigApplicationContext(설정클래스명.class) : config 파일을 이용해 ApplicationContext 인터페이스 구현
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam03 {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Car car = (Car)ac.getBean("car");
car.run();
}
}
2) @ComponentScan을 이용해 설정파일 구성
- ApplicationConfig2.java : 스프링 설정 클래스
- @ComponentScan("범위 패키지") : 지정한 패키지 범위 내에서 @Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록
- 이 외의 객체들을 @Bean을 통해 직접 등록
package kr.or.connect.diexam01;
import org.springframework.context.annotation.*;
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
- Engine, Car 클래스 : Bean 클래스
- @Component : ComponentScan의 대상이 될 수 있도록 어노테이션 지정. 주로 유틸, 기타 지원 클래스에 붙인다.
- @Autowired : 주입 대상이 되는 bean을 컨테이너에서 찾아 주입하는 어노테이션 (DI의 역할)
(Engine.java)
package kr.or.connect.diexam01;
import org.springframework.stereotype.Component;
@Component
public class Engine {
public Engine() {
System.out.println("Engine 생성자");
}
public void exec() {
System.out.println("엔진이 동작합니다.");
}
}
(Car.java)
package kr.or.connect.diexam01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
@Autowired
private Engine v8;
public Car() {
System.out.println("Car 생성자");
}
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
}
- ApplicationContextExam04.java : 설정클래스를 읽는 예시코드
- getBean(bean클래스명.class) : 이름 지정없이 클래스로 받아들일 수 있음
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam04 {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
Car car = ac.getBean(Car.class);
car.run();
}
}
'웹 > 백엔드' 카테고리의 다른 글
Spring MVC (부스트코스) (0) | 2022.04.17 |
---|---|
Spring JDBC - (부스트코스) (0) | 2021.04.11 |
WEB API - (부스트코스) (0) | 2021.04.09 |
JDBC - (부스트코스) (0) | 2021.04.08 |
Maven - (부스트코스) (0) | 2021.04.08 |