Code Monkey home page Code Monkey logo

study_springframework's Introduction

study_SpringFramework

Spring을 공부한 것을 정리하는 Repository

  • Spring Framework 버전 5를 중심으로 수업하지만 버전 4에서 테스트가 완료된 상태이다.
  • 윤재성의 Spring Framework 개발자를 위한 실습을 통한 입문 과정

Setting

  1. Elicpse에서 JAVA EE 모드로 변경
  2. File -> New -> Maven Project
  3. 체크박스(Create a simple project) 클릭
  4. Group ID는 group id, Artifact ID는 프로젝트 이름으로 작성
  5. 프로젝트 이름 -> Properties -> Project Facets -> Convert to faceted form
    • 자바 처음 세팅이 1.5버전으로 되어있기 때문에 자바 1.8부터의 유용한 문법들을 사용할 수 없어 교체해주는 것이다.
  6. Java -> 1.8 -> Apply

Spring Framework

  • 기능이 구현되는 순서: Controller -> Service -> ServiceImp -> DAO -> SQL(XML) -> JSP
  • 가장 많이 사용하는 Java 기반 응용 프로그램 개발 프레임워크
  • 모든 Java 애플리케이션 개발에 이용할 수 있으며 Java EE 위의 웹 애플리케이션 개발에 주로 사용되고 있다.
  • 정부 표준 프레임 워크도 마찬가지이다.
  • 스프링 프레임 워크를 사용은 xml을 이용하는 방법과 자바 어노테이션을 이용하는 방법 두 가지로 구분할 수 있다.
  • 보통 Maven이나 Gradle을 이용해 라이브러리를 다운 받아 사용한다.
  • 특징
    • 메모리를 적은 컨테어너로써 자바 객체를 직접 관리한다.
    • POJO(Plain Old Java Object) 방식의 프레임 워크
      • 일반적인 J2EE 프레임워크에 비해 특정 라이브러리를 사용할 필요가 없어서 개발이 쉬우며, 기존 라이브러리의 지원이 용이
    • IOC(Inversion of Control) 지원
      • 컨트롤의 제어권이 개발자가 아니라 프레임워크에 있음을 말한다. 즉, 객체의 생성부터 모든 생명주기의 관리까지 객체의 제어권이 바뀐 것이다.
    • DI(Dependency Injection) 지원
      • 어떤 객체가 필요로 하는 객체를 자기 자신이 직접 생성하는것이 아니라, 외부에 있는 다른곳에서 자신이 필요로 하는 객체를 주입받는 것이다.
    • AOP(Aspect-Oriented Programming) 지원
      • 트랜잭션, 로깅, 보안 등 여러 모듈, 여러 계층에서 적용되는데, 이런 코드들을 실제 비지니스 로직과 분리할 수 있도록 도와준다.
    • iBATIS, myBATIS, Hibernate 등의 데이터베이스 라이브러리를 지원한다.
    • 이외 특징
      • Java 파일에서 Java 코드를 줄일 수 있다.
      • 다수의 개발자와 동시에 프로젝트 하기가 용이하다.
      • 반복되는 작업을 줄일 수 있어 기능 개발에 집중할 수 있다.
      • 프로젝트 관리가 용이하다.
  • xml에 객체를 생성 위한 코드를 작성한다.
  • IoC 컨테이너를 이용하여 bean 객체들을 관리한다.

Spring Framework 기능

  • 객체 생성과 소멸 시 호출될 메서드 등록
    • 객체가 생성될 때 생성자가 호출된 이후 init-method에 설정한 메서드가 자동으로 호출되고 IoC 컨테이너의 close 메서드를 호출하면 객체가 소멸되며 destroy-method에 설정한 메서드가 자동으로 호출된다.
    • init-method와 destroy-method가 설정되어 있지 않다면 default-init-method와 default-destory-method에 설정되어 있는 메서드를 호출한다.
    • init-method; 생성자 호출 이후 자동으로 호출된다.
    • destory-method: 객체 소멸될 때 자동으로 호출된다. -> [ctx.close()일 때 소멸]
    • default-init-method: init- method를 설정하지 않은 경우 자동으로 호출된다.
    • default-destory-method: destory-method를 설정하지 않은 경우 자동으로 호출된다.

Maven

  • 자바 프로젝트의 빌드를 자동으로 해주는 도구이다.
  • XML에 작성한 프로젝트 정보를 바탕으로 컴파일하고 라이브러리를 연결하는 등 작업을 해주는 도구이다.
  • Maven 서버를 통해 라이브러리를 다운받아 설정하는 작업도 수행한다.
  • pom.xml에 maven 프로젝트와 관련된 사항을 작성한다.

IoC(Inversion of Contrl) 컨테이너

  • 프로그래밍을 작성할 때 프로그램이 흘러가는 흐름이나 생성되는 객체에 대한 제어권을 개발자가 만드는 개발자가 가지는 것과 달리 프레임워크가 가지는 것을 의미한다.
  • 프레임워크가 사용하는 파일에 작성하면 이를 토대로 프레임워크가 객체를 생성하여 반환하고 코드가 동작하는 순서를 결정하게 된다.
  • 종류: BeanFactory, ApplicationContext
    • BeanFactory: 클래스를 통해 객체를 생성하고 전달하며 상속 등 객체 간의 관계를 형성하고 관리한다.
    • ApplicationContext: BeanFactory 기능에 더하여 국제화 지원 등 문자열에 관련된 다양한 기능을 제공하고 리스너로 등록되어 있는 Bean에 이벤트를 발생시킬 수 있다.

- Metadata: xml이나 java 코드를 가지고 설정한 정보이다. - JAVA POJO classes: 만들어 놓은 객체이다. - 동작: IoC 컨테이너가 Metadata에서 읽어와서 그 정보를 토대로 POJO class를 가지고 객체를 만들어서 그 객체를 사용할 수 있도록 반환한다.

POJO(Plain Old Java Object) Class

  • 자바 모델이나, 기능, 프레임워크 등에 따르지 않고 독립적이며 단순한 기능만을 가진 객체이다.
  • 자바에서는 이러한 객체를 Bean라고 부른다.

BeanPostProcessor

  • BeanPostProcessor 인터페이스를 구현한 클래스를 정의하면 Bean 객체를 생성할 때 호출될 init 메서드 호출을 가로채 다른 메서드를 호출 할 수 있도록 할 수 있다.
  • postProcessBeforeInitialization: init-method에 지정된 메서드가 호출되기 전에 호출된다.
  • postProcessAfterInitialization: init-method에 지정된 메서드가 호출된 후에 호출된다.

Bean

  • beans : 데이터를 관리하기 위한 목적으로 사용하거나 도구적인 성격을 가지고 있는 method 들을 가지고 있는 Class들을 모아둔다.
    • beans.xml 작성 시 내용
      • beans.xml에 작성한 후 getBean 메소드를 통해서 받아오는 것이 아니라 참조변수를 선언해 놓으면 객체 주소값이 자동으로 들어가는 자동 주입이라는 기능이 있다. 자동 주입을 이용하게 되면 id 속성이 필요없다.
        • getBean으로 생성된 객체는 더이상 생성되지 않고 주소값만 받아온다. -> Singleton [같은 객체의 같은 주소값만을 계속 받기 때문이다.] [bean 태그의 기본 속성]
      • lazy-init= "true"을 사용하면 xml을 로딩할 때 객체 생성을 하지 않고 getBean을 사용할 때만 객체를 생성한다.
      • scope: 객체의 범위를 설정한다.
        • singleton: 객체를 하나만 생성해서 사용한다.
        • Prototype: xml 로딩할 때 객체가 생성되지 않고 getBean 메소드로 객체를 호출할 때 마다 새로운 객체를 생성한다.
  • bean 객체의 생명주기
    • Singleton인 경우 xml 파일을 로딩 할 떄 객체가 생성된다.
    • Singleton이고 lazy-init 속성이 true인 경우 getBean 메서드를 사용할 때 객체가 생성된다.
    • Prototype 일 경우 getBean 메서드를 사용할 때 객체가 생성된다.

Dependency Injection

  • Bean 객체를 생성할 때 Bean 객체가 관리할 값이나 객체를 주인하는 것을 의미한다.
  • Bean 객체 생성 후 Bean 객체가 가질 기본 값을 자바 코드로 설정하는 것이 아닌 Bean을 정의하는 xml 코드에서 정의하는 개념이다.
  • 컬렉션 주입
    • Bean을 정의할 때 주입해야 하는 멤버가 컬렉션인 경우 컬렉션이 관리할 객체를 초기에 설정할 수 있다.
    • List, Map, Set Property를 사용
  • 자동 주입
    • 이름, 타입, 생성자로 통할 수 있으며 auto wire라는 용어로 부른다.

Annotaion 활용

  • benas.xml 파일에 등록했던 내용을 java 파일에 작성할 수 있다. xml은 값을 정해줘야 하는 반면 java 파일은 코드를 자유롭게 작성할 수 있다.
  • Bean 설정 파일에 <context:annotation-config/> 코드를 추가하면 빈에 대한 설정을 xml 파일이 아닌 Bean 클래서 Annotation을 검색해 반영하게 된다.

Annotation 설명

  • 초기화 방법
AnnotationConfigApplicationContext ctx 
			= new AnnotationConfigApplicationContext();
ctx.register(BeanConfig.class);
ctx.refresh();
  • @Configuration: 현재 자바 파일이 빈 등록을 위한 자바 파일임을 알려준다.
  • @Bean: bean 객체를 정의할 때 사용한다. 메서드의 이름이 bean의 이름이 된다.
    • @Bean(name=[이름]): bean의 이름을 새롭게 벙의한다.
    • @Lazy: lazy-init 속성을 지정한다.
    • @Scope: bean의 scope를 설정한다.
    • @Primary: primary 속성을 지정한다.
  • init, destroy 메서드
    • @Bean(initMethod = "bean2_init", destroyMethod = "bean2_destroy")
  • 자동 주입
    • @Bean(autowire = 주입방식): 자동 주입 방식을 설정한다.
    • Autowire.BY_NAME : 이름을 통한 자동 주입이다.
    • Autowire.BY_TYPE : 타입을 통한 자동 주입이다.
  • Bean 설정
    • @Required: 반드시 주인 해야 할 프로퍼티로 설정한다.
    • @Autowired: 객체 타입을 통해 bean 객체를 자동으로 주입한다.
    • @Qualifier: @Autowired는 주입 시 같은 타입의 Bean의 여러 개 정의되어 있다면 Qualifier에 설정 되어 있는 bean을 찾아 주입한다.
    • 생성자 주입 @Value: 생성자에 주인 시 참조변수 타입 변수들은 자동으로 주입되고 기본 자료형 및 문자열 값만 주입을 설정해주면 된다.

Component

  • @Component를 사용하면 Bean Configuration 파일에 Bean을 등록하지 않아도 자동으로 등록된다.
    • Xml을 이용하는 방식 <context:component-scan base-package="kr.co.softcampus.beans"/>
    • Bean Configuration Class 사용 @ComponentScan(basePackages = {"kr.co.softcampus.beans", "kr.co.softcampus.bean2"})
  • Component Bean 기본 설정
    • @Component("이름"): 설정한 이름으로 Bean 객체를 가져온다.
    • @Lazy: getBean 메서드를 호출할 때 객체가 생성된다.
    • @Scope("prototype"): Prototype으로 설정한다.
    • @PostConstruct, @PreDestroy: 생성자 호출 이후 자동으로 호출될 메서드와 객체가 소멸될 떄 자동으로 호출되는 메서드를 등록된다.

A. 자바 프로젝트

  • 문제점
    • 자바 프로젝트에서 클래스가 변경되면 객체 생성 부분과 참조 변수 선언 부분 모두를 수정해야 한다.
    • 즉, 유지보수가 불편해 진다.

B. 다형성

  • 자바에서의 모든 객체는 부모클래스형 참조변수나 구현한 인터페이스 변수에 담을 수 있다. (overwriting)
  • 이러한 참조변수를 통해 메서드를 호출하면 Overwriting 된 메서드가 호출된다.
  • 문제점
    • 다형성 개념을 사용하면 클래스가 변경되었을 때 참조 변수 선언 부분은 수정하지 않아도 되지만 객체를 생성하는 부분의 코드는 변경되어야 한다.
    • 유수보수가 어렵다.

===> A, B의 문제점을 해결하기 위해 사용하는 것이 Spring Framework이다.

- Spring Framework와 같은 경우 beans.xml 파일만을 수정하면 된다.

기타

  • logback 과 slf4j를 다운 후 연결한 후 다음과 같은 코드를 pom.xml에 추가하면 runtime 중에 로그를 볼 수 있다.
		<!-- logback -->
		<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${ch.qos.logback}</version>
			<exclusions>
				<exclusion>
				<!-- logback이 연결해서 사용할 수 있도록 -->
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>

AOP(Aspect Oriented Programming)(관심 지향 프로그래밍) [라이브러리 다운 필요!!]

  • 로깅, 감사, 선언적 트랜젝션, 보안, 캐싱 등 다양한 곳에서 사용되고 있다.
  • 용어
    • Joint Point: 모듈이 삽입되어 동작하게 되는 특정 위치(메서드 호출 등)이다.
    • Point Cut: 다양한 Joint Point 중에 어떤 것을 사용할지 선택한다.
    • Advice: Joint Point에 삽입되어 동작할 수 있는 코드이다.
      • before: 메서드 호출 전에 동작하는 Advice이다.
      • after-returning: 예외 없이 호출된 메서드의 동작이 완료되면 동작하는 Advice이다.
      • after-throwing: 호출된 메서드 동작 중 예외가 발생했을 때 동작하는 Advice이다.
      • after: 예외 발생 여부에 관계없이 호출된 메서드의 동작이 완료되며 동작하는 Advice이다.
      • around: 메서드 호출 전과 후에 동작하는 Advice이다.
    • Weaving: Advice를 핵심 로직 코드에 적용하는 것이다.
    • Aspect: Point Cut + Advice
  • 동작
    • AOP 개념이 적용이되서 동작할 코드들이 Adivce이고 메서드 호출을 관심사에 등록해 놓으면 Joint Point가 된다. 이 메서드 호출이 동작을 할 때 모듈 들을 연결을 해서 동작시키도록 설정하는 것은 Point Cut이다. 호출된 메서드에 전 혹은 후에 동작할 코드를 삽입해서 하나의 동작으로 만드는 행위가 Weaving이다.

Eclipse 단축키

  • ctrl + Shift +/ : 주석
  • ctrl + Shift + : 주석 풀기

Installation

  • 설치할 프로그램 목록
    • JDK(Java 8.0 이상 권장)
    • Elicpse

study_springframework's People

Contributors

chea-young avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.