스프링 빈이란?

스프링이 객체를 생성해 들고 있는다.

즉, 스프링 컨테이너가 생성될 때 컨트롤러(빈)가 같이 생성된다.

 

why?

객체를 계속 생성할 필요가 없고 미리 생성해 그것을 사용한다.

 

빈과 의존관계

 

컨트롤러(@Controller) -> 서비스

컨트롤러로 요청이 들어오면 서비스를 통해 비즈니스 작업을 해야 하기에 컨트롤러가 서비스에 의존한다.

 

의존관계 주입방법

컨트롤러, 서비스를 다 빈으로 등록해준다.

의존관계를 생성할 땐 @Autowired를 사용한다.

 

빈등 록 방식

1. 컴포넌트 스캔

2. 자바 코드로 스프링 빈 등록

 

빈 등록은 메인 메서드가 있는 패키지부터 시작한다.

즉, 하위 패키지에 있는 것만 등록된다.


자바 코드로 빈 등록하기

 

@Configuration

public class SpringConfig {



    @Bean

    public MemberService memberService() {

        return new MemberService(memberRepository());

    }



    @Bean

    public MemberRepository memberRepository(){

        return new MemoryMemberRepository();

    }

}

애노테이션으로 등록하기

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start =  System.currentTimeMillis();
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println(joinPoint.toString()+" / timeMs : "+timeMs+"ms");
        }

    }
}

@Component,@Service,@Repository 대신 자바로 등록할 수 있다.

정형화된 코드(@Service,@Repository)는 컴포넌트 스캔을 사용한다.

 

또, 생성자로 빈을 생성하는 게 제일 안전하다.

    private final MemberRepository memberRepository;
	
    //생성자
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

스프링 이전에 Servlet을 직접 사용할땐 URL마다 하나하나 만들어야하고

 

각각의 설정하기가 매우 복잡했다.

 

이것을 해결하는것이 Spring의 dispatcherServlet이다.

매번 반복작업하던 비생산적인 작업들을 스프링이 뒷단에서 직업해주고 있다.

 

HandlerMapping 으로 클라이언트가 서버에 요청할때 접근할 수 있게 해주고

HandlerAdapter로 요청에 맞는 기능을 찾아준다.

//스프링 내부 소스코드
//스프링이 구동될떄 초기에 여러 형태를 미리 준비해놓을 수 있다.

protected void initStrategies(ApplicationContext context) {
    this.initMultipartResolver(context);
    this.initLocaleResolver(context);
    this.initThemeResolver(context);
    this.initHandlerMappings(context);
    this.initHandlerAdapters(context);
    this.initHandlerExceptionResolvers(context);
    this.initRequestToViewNameTranslator(context);
    this.initViewResolvers(context);
    this.initFlashMapManager(context);
}

또 한 여러 작업을 하고 클라이언트에게 다시 송출할때도

viewResolver로 보내준다.

viewResolver는 기본으로 제공해주지만 아래처럼 커스텀해서 사용할 수 있다.

//viewResolver 설정해서 간단하게 사용하기

@Configuration
@ComponentScan
public class OneServletWebConfig {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
}

 

요청을 받고 요청의 맞는 기능을 구현하고 형태에 맞게 화면에 전송하는 것을 다구현하지않고

스프링의  dispatcherServlet이 구현해준다.

Environment

 

Application Context은 Bean Factory기능만 하는게 아니다.

Application Context의 기능은 여러가지가 있다.

 

그 중하나가 Environment이다.(환경설정)

 

Environment 프로파일(Profile) 

프로파일이란 Bean들의 묶음 특정 Bean들을 묶어 사용할때 유용하다.

 

@Profile로 ComponentScan으로 등록할 수 있고 

@Repository

@Profile("!prod")//ComponentScan에 등록하기

public class TestBookRepository implements BookRepository{



    @PostConstruct

    @Override

    public void run() {

        System.out.println("TestBookRepository 생성");

    }

}

 

@Configuration을 통해 Class형식으로 등록할 수있다 

//profile정하고 class로 등록하는방법

@Configuration

@Profile("test")//test profile일때만 사용

public class TestConfiguration {



    @Bean

    public BookRepository bookRepository(){

        return new TestBookRepository();

    }

}

또 특정 profile만 실행하는 것이 아닌 특정 프로파일이 아닐때도 사용가능하다. !not 사용

prod Profile이 아닐때 예제코드

@Repository
@Profile("!prod")//ComponentScan에 등록하기
public class TestBookRepository implements BookRepository{

    @PostConstruct
    @Override
    public void run() {
        System.out.println("TestBookRepository 생성");
    }
}

 

environment를 통해 properties 사용하기

Configuraion에 VMoption을 등록하거나

resources 경로 아래 Properties 파일을 생성하고

스프링시작부분에 @PropertySource("classpath:./App.Properties”)를 등록하고

꺼내올 수 있다.

@SpringBootApplication

@PropertySource("classpath:./App.Properties")

public class EnvironApplication {



    public static void main(String[] args) {

        SpringApplication.run(EnvironApplication.class, args);

    }

}

 

 

BeanFactory에 등록된 bean들은 scope가 있다.

 

기본 Scope : Singleton Scope

Singleton Scope 이란?

해당 인스턴스가 하나뿐이다. 같은 인스턴스를 재사용하는 것이다.

 

기본적으론 생성된 bean은 SingletonScope이라 같은 인스턴스을 바라본다.

@Scope("prototype”)를 설정하면 매번 다른 인스턴스를 생성할 수 있다.

 

@Scope(“prototype”)차이점 보기

1.Single Class는 기본 Singleton 스코프

2.Proto Class는 prototype스코프로 선언

 

출력해보면 결과가 다르게 나온다.

@Component

public class Single {



    @Autowired

    Proto proto;



    public Proto getProto() {

        return proto;

    }

}



@Component @Scope("prototype")

public class Proto {

}



@Override

public void run(ApplicationArguments args) throws Exception {

        System.out.println("single");
        System.out.println(context.getBean(Single.class));
        System.out.println(context.getBean("single"));
        System.out.println(single);

        System.out.println("poroto");
        System.out.println(context.getBean(Proto.class));
        System.out.println("----");
        System.out.println(context.getBean("proto"));
        System.out.println("---");
        System.out.println("single.getProto().getClass() : 1----");
        System.out.println(context.getBean(single.getProto().getClass()));
        System.out.println("single.getProto().getClass() : 2----");
        System.out.println(context.getBean(single.getProto().getClass()));
        System.out.println("----같은 인스턴스 보는 이슈");
        System.out.println(context.getBean(Single.class).getProto());
        System.out.println(context.getBean(Single.class).getProto());


}
single
com.choi.scope.Single@4b6e1c0
com.choi.scope.Single@4b6e1c0
com.choi.scope.Single@4b6e1c0
poroto
Proto 인스턴스 생성
com.choi.scope.Proto@26cb5207
----
Proto 인스턴스 생성
com.choi.scope.Proto@15400fff
---
single.getProto().getClass() : 1----
Proto 인스턴스 생성
com.choi.scope.Proto@18d910b3
single.getProto().getClass() : 2----
Proto 인스턴스 생성
com.choi.scope.Proto@1e7ab390
----같은 인스턴스 보는 이슈
com.choi.scope.Proto@11d4dbd6
com.choi.scope.Proto@11d4dbd6

ProtoType에서 Singleton을 Autowired 하면 큰 문제없다.

하지만 Singleton에서 Prototype을 Autowried 한다면?

계속 같은 주소를 불러오는 이슈가 있다.

이때는 @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)

설정으로 프록시로 감싸서 사용하면 된다.

 

@Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)

public class Proto {



    @PostConstruct

    public void main(){

        System.out.println("Test");

        System.out.println("생성자 주입");

        System.out.println("Proto 인스턴스 생성");

    }

}
single
com.choi.scope.Single@2f897dab
com.choi.scope.Single@2f897dab
com.choi.scope.Single@2f897dab
poroto
Proto 인스턴스 생성
com.choi.scope.Proto@39a87e72
----
Proto 인스턴스 생성
com.choi.scope.Proto@5d2828c9
---
single.getProto().getClass() : 1----
Proto 인스턴스 생성
com.choi.scope.Proto@3a082ff4
single.getProto().getClass() : 2----
Proto 인스턴스 생성
com.choi.scope.Proto@45acdd11
----같은 인스턴스 보는 이슈 해결
Proto 인스턴스 생성
com.choi.scope.Proto@3f0d6038
Proto 인스턴스 생성
com.choi.scope.Proto@237f7970

DB 연결을 자주 수정해야 할 때가 있다면 유용하게 사용할 수 있을 것 같다.

 

보통 Singletion 생명주기가 길다. 여러 스레드에서 참조하는 경우 값이 계속바뀔수 있기에 prototype으로 생성하는것이 좋을거 같다.

Autowired란?

빈에서 다른 빈의 의존성을 주입하는것이다.

즉, A bean이 B bean을 사용하려면 @Autowired해준다.

 

Autowired된 bean을 먼저 생성한다. 생각해보면 먼저 생성되어있어야 사용할 수 있다.

@Component
public class BookServiceRunner implements ApplicationRunner {

    //BookService를 사용한다.
    @Autowired
    BookService bookService;

    public void run(ApplicationArguments args) throws Exception{
        bookService.printBookRepository();
    }
}

 

기본적으로는 Autowired를 사용하면 의존성이 있어야하므로 bean으로 등록되어있어야한다.

 

필드,setter에선 (required = false) 으로 의존성을 강제하지 않을 수 있다.

필드에 사용하는것과 생성자에 사용하는건 약간다르다.

    //BookService를 사용한다.
    //의존성 강제 설정해체
    @Autowired (required = false)
    BookService bookService;

 

또 repository가 여러개일 경우 충돌이 난다. 

이럴땐 @Primary나 @Qualifier("huBookRepository")로 강제해주어야한다.

Primary형식

//Primary형식
@Repository @Primary
public class MyBookRepository implements BookRepository {
    @Override
    @PostConstruct
    public void setUp() {
        System.out.println("MyBookRepository");
    }
}

Qualifier형식

    //Qualifier형식
    @Autowired @Qualifier("myBookRepository")
    BookRepository bookRepository;

아니면 모두 사용하고 싶을 경우 LIst형식으로 받을 수 있다.

    @Autowired
    List<BookRepository> bookRepository;

LOG를 찍어보게되면 BookRepository를 implements한 클래스가 모두 나온다

@Service
public class BookService {

    @Autowired
    List<BookRepository> bookRepository;

    public void printBookRepository(){
        this.bookRepository.forEach(System.out::println);
        System.out.println(bookRepository.getClass());
    }
}

인스턴스 생성될때 동작하기 

@Repository
public class MyBookRepository extends TestExtends implements BookRepository  {
    @Override
    @PostConstruct
    public void setUp() {
        System.out.println("MyBookRepository");
    }
}

 

 

 

 

@Component와 컴포넌트 스캔

Component는 스프링 3.1부터 적용되었다.

 

@Component를 사용할 경우 IOC컨테이너에 bean으로 등록한다.

@Service,@Repository,@Controller등 여러가지 애노테이션엔

@Component가 포함되어있다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component //Service에 등록되어있는 Component
public @interface Service {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

ComponentScan

여러가지 bean들을 검색하고 IOC컨테이너에 적재한다.

 

스프링부트에선 @SpringBootApplication가 시작지점이 된다.

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

SpringBootApplication 내부 모습

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

 

@SpringBootApplication 이하의 모든 클래스가 @ComponentScan

(basePackages,basePackageClasses)에 의해 컴포넌트 스캔이된다.

 

만약 개발할때 bean주입이 안되면 컴포넌트 스캔위치를 살펴봐야한다.

모든걸 bean으로 등록하는것이 아니라 필터로 걸러낼 수 있다.

 

, 빈을 다등록하는게 부담된다면 펑션으로 특정빈만 등록할 있다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

Spring Environment 기초 사용방법  (0) 2020.07.13
Spring Scope란?  (0) 2020.07.13
AOP란? AOP 기초개념  (0) 2020.07.09
Spring IoC(Inversion of Control),Bean,의존성주입이란?  (0) 2020.07.08
프레임워크 개념  (0) 2018.01.26

IOC 

Inversion of Control

제어권이 뒤바뀐다.

원래는 자기가 사용할 의존성은 자기가 만들어 사용한다.

Ex) new로 생성해서 사용하는 것

 

Ioc는 사용하지만 만들지 않는다. 즉 누군가가 생성해준다.

누군가란? 스프링

Ex) new를 사용하지 않는다.

 

의존성 주입 예제

 

스프링에서 의존성을 주입해준다.(생성자 방식)

private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService, VisitRepository visits) { 
	this.owners = clinicService; 
    //vistis 는 생략 this.visits = visits;
}

 

만약 IoC가 적용 안되었다면?

이런 식으로 사용하면 원래 Null point Exception 에러가 난다.

 

Spring이 관리하는 객체를 Bean이라고 함.

즉, 스프링이 빈 객체를 생성해 주입해줘서 동작되게 한다.

 

결론 : IoC에서 객체 생성은 내가 하는 것이 아닌 스프링이 필요한 의존성을 주입해준다. 

 

IOC 컨테이너(Bean Factory) ApplicationContext

Bean Factory이 IOC 컨테이너인데 ApplicationContext는 BeanFactory를 상속받는다.

 

IOC컨테이너 역할

bean 생성하고 bean들 사이에 의존성을 엮어주고 스프링에 제공해준다.

 

OwnerController, OwnerRepository 등 즉 컨트롤러, 레파지토리 등은 빈으로 등록해 사용한다.

 

모든 클래스가 다 무조건 bean으로 등록되는 것이 아니다.

 

@Controller 등

@으로 등록하는 방식,

extends Repository 상속하는 방식,

@Bean으로 등록하는 방식 등

여러 가지 방법으로 Bean으로 설정이 가능하다.

 

의존성 주입은 bean끼리만 사용한다. 예외의 경우 다른 객체에 할 수 있지만 거의 하지 않는다.

즉, 주로 IOC컨테이너 안에 있는 객체에만 서로 의존성 주입을 한다.

 

IOC컨테이너는 매번 새로 객체를 생성하는 것이 아니라 생성된 객체를 같이 사용한다.

 

Bean

IoC 컨테이너가 관리하는 객체를 말한다. 

ApplicationContext가 만들어서 그 안에 담고 있는 객체를 말한다.

Component Scannig

-@Controller

-@Service

-@Repository

-@Component

등 여러 가지 등을 찾아서 bean으로 등록한다.

 

ex)

public interface OwnerRepository extends Repository<Owner, Integer>

Repository를 보면 특정한 @이 없더라도 특정 인터페이스를 상속받는 클래스를 찾아서 

내부에서 인터페이스를 구현하고 Bean으로 등록한다.

 

직적 Bean으로 등록

@Configuration과 @Bean으로 등록할 수 있다.

@Configuration(proxyBeanMethods = false)

@EnableCaching

class CacheConfiguration {



@Bean

public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() {

return cm -> {

cm.createCache("vets", cacheConfiguration());

};

}

}

 

 

@Autowried로 IoC컨테이너에서 객체를 꺼내 사용할 수 있다.

 

 

의존성 주입(Dependency Injection)

 

@Autowried로 보통 주입을 한다.

생성자

스프링 4.3부터 이상부턴 생성자에서 생략하고 사용할 수 있다.

public OwnerController(OwnerRepository clinicService, VisitRepository visits) {

this.owners = clinicService;

this.visits = visits;

}

,

필드

@Autowired

private final OwnerRepository owners;

, set

public void setOwners(OwnerRepository r){

this.owners = r;

}

등으로 주입할 수 있다.

 

주의점 : final로 생성하면 무조건 생성하거나 생성자를 만들어야 한다.

 

 

생성자를 생성하자 않고 @Autowried로 생성자 주입도 가능하다. (자주 사용하는 방법)

bean으로 등록되어있지않으면 의존성주입은 불가능하다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

Spring Autowired와 ComponentScan이란  (0) 2020.07.10
AOP란? AOP 기초개념  (0) 2020.07.09
프레임워크 개념  (0) 2018.01.26
SpringMVC란?  (0) 2018.01.11
MVC패턴이란?  (0) 2018.01.11

프레임워크 개념


1.sw 재사용성

2.디자인패턴 프레임워크란? 둘의 관련성

3.프레임워크 구성요소 종류


재사용 방법

copy & paste

가장 기본적인 방법이다.

ex)날짜 형태 지정 java

a클래스에 있는 코드를  b클래스에서 사용하기위해 복사 붙여넣기한다.

문제점- jdk가 바뀐다면? 코드가 있는 모든 클래스에 영향이가게된다.


method function(메소드호출)

a클래스에있던 코드를 메소드를 생성하여 집어넣는다.

클래스이름.메소드로 사용가능하다.

(호출하는쪽에는 영향이안감)


문제점 - MethodSignature(메소드명, 리턴타입, 아큐먼트 갯수,타입등)

복사 붙여넣기보단 진보된 방식이지만 작업영역간 결합도 문제 존재한다.


Class

메소드를 클래스 내부에 구현해서 만들어놓은것이다.

메소드를 구성해놓은 클래스를 상속한다.

자식 클래스에서 사용한다.

메서드방식보단 개선된 방식이다.


문제점 - signature 문제는 그대로있다.


AoP(관심의 분리)

- OOP를 supprt해주는 개념

- C에서도 사용가능

*관심사 분리

주제:은행

횡단관심모듈(기능적 로직)

ex)보안,로깅

핵심관심모듈(비지니스로직)

ex)계좌이체,입출금,이자계산

위빙 : 핵심관심모듈에서 횡단관심모듈을 직접 호출하지 않음(프레임워크에서 해줌)


AoP란?(간단설명)

간단하게말해, 계좌이체를 하게될때 로그를 남기게되는데 

코드상에서 직접호출하지 않고 프레임워크에서 처리해준다.







디자인패턴과 프레임워크의 관련성

디자인패턴의 정의

프로그램개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나이다.

개발과정에 발견된 Know_how를 축적하여 이름붙인다.

재사용하기 쉽게 특정 규약을 묶어서 정리한것.

대표적인 디자인패턴(GOF)에서 23가지 지원한다.


디자인패턴 사용하는 이유

- 요구사항 변경에따른 소스코드변경 최소화

- 팀 프로젝트시 범용적인 코딩 스타일적용

- 인수인계시 직관적인 코드 사용


프레임워크의 정의

- 비기능적(Non-Funtional) 요구사항(성능,보안,로깅,확장성,안정성등)을 만족하는 구조와

구현된 기능을 안정적으로 실행하도록 제어해주는 잘만들어진 구조의 라이브러리 덩어리

또 애플리케이션들의 최소한의 공통점을 찾아 하부 구조를 제공함.

- 개발자들이 시스템 하부구조 구현하는데 들어갈 노력을 절감해준다.


프레임워크를 사용하는이유

비기능적인 요소(보안,로깅) 초기개발단계마다 구현해야하는 불합리함 극복할수있다.

- 기능적인 요구에만 집중(비지니스로직)하면된다.

- 반복적으로 발견되는 문제를 해결하기위한 특화된 Solution이다.



디자인패턴과 프레임워크의 관련성

- 디자인패턴은 프레임워크의 핵심적인 특징(프레임워크내부에 디자인패턴 적용해서 사용)이 있다.

- 프레임워크를 디자인패턴이라고는 하지못함. 디자인패턴을 사용하고있는 것이다.

- 프레임워크는 디자인 패턴과함께 패턴이 적용된 라이브러리를 제공한다.


프레임워크가 내부적으로 디자인패턴사용한다.

프레임워크를 사용하면 녹아들어가있는 디자인패턴을 사용하게된다.






프레임워크의 구성요소와 종류

Ioc(제어의 역전)

ClassLibrary

Design Patterm


IOC(제어의 역전)

- 인스턴스 생성 부터 소멸이 컨테이너가 처리(개발자가 안함)한다.

- 프레임워크한테 권한을 넘김으로써 개발자 코드가 신경쓸 부분을 줄여준다.

차이점


프레임워크(IOC적용) 사용할때

 라이브러리 사용할때

 프레임워크가 개발자가 작성한 코드를 호출

 개발자가 라이브러리 호출(스트링유틸사용시)


주도권이 프레임워크가 가지고있음(제어의 역전)

Spring 컨테이너가 IOC지원함.

-메타데이터(XML설정)를 통해 beans를 관리하고 어플리케이션의 중요부분을 형상한다.

bean들을 의존성 주입을 통해IoC지원한다.


ClassLibrary

특정 부분의 기술적인 구현을 라이브러리 형태로 제공(반제품) 기본적인 뒷단을 구성되어있다.

프레임워크코드가 유저코드를 호출(이게 제어역전)한다.





디자인패턴

디자인 패턴 + 라이브러리 = 프레임워크

프레임워크 사용시 라이브러리의 디자인패턴을 보면 구성을 이해하기쉽다.

커스터마이징할때도 디자인패턴의 이해가 필요하다.


'개발 소발 > 개발 Spring' 카테고리의 다른 글

AOP란? AOP 기초개념  (0) 2020.07.09
Spring IoC(Inversion of Control),Bean,의존성주입이란?  (0) 2020.07.08
SpringMVC란?  (0) 2018.01.11
MVC패턴이란?  (0) 2018.01.11
Mybatis Mapper 인터페이스란?  (0) 2018.01.11

SpringMVC란?


Spring MVC의 특징

- Spring은 DI나 AOP같은 기능뿐만 아니라, 서블릿 기반의 웹 개발을 위한 MVC프레임워크를 제공한다.

- SpringMVC는 모델2 아키텍쳐와 FrontController 패턴을 프레임워크 차원에서 제공한다.


- SpringMVC프레임워크는 Spring을 기반으로 하고 있기 때문에 Spring이 제공하는 트랜잭션 처리나 DI 및 AOP등을 손쉽게 사용한다.


SpringMVC와 FrontController 패턴

어떤 연관성이 있을까?

- 대부분의 MVC 프레임워크들은 FrontController 패턴을 적용해서 구현한다.

- Spring MVC도 FrontController역할을 하는 DispatcherServlet 이라는 클래스를 계층의 맨 앞단에 놓고, 서버로 들어오는 모든 

요청을 받아서 처리하도록 구성되어있다.

DispatcherServlet이 FrontController 역할을 한다.


- 예외가 발생했을 때, 일관된 방식으로 처리하는 것도 FrontController의 역할이다.



DispatcherServlet 클래스

- FrontController 패턴 적용

- Web.xml에 설정한다.

- 클라이언트로부터의 모든 요청을 전달 받게된다.


- Controller나 View와 같은 Spring MVC의 구성요소를 이용하여 클라이언트에게 서비스를 제공한다.


DispatcherServlet은 개발자가만든 Controller에 위임한다.

개발자가만든Controller는 핸들링(처리) 하여 모델을 DispatcherServlet에 전달한다.

DispatcherServlet은 View에게 model전달한다.

view는 화면생성후 DispatcherServlet에게 전달한다.


Spring MVC의 주요 구성 요소

 

 DispatcherServlet

 - 클라이언트의 요청을 받아서 Controller에게 클라이언트의 요청을 전달하고,

리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성한다.

 HandlerMapping

 - URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며,

      DispaccherServlert에게 알려준다.

 Controller

 - 클라이언트의 요청을 처리한 뒤, Model를 호출하고 그 결과를 DispatcherServlet에게 알려 준다.

 ModelAndView

 - Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체이다.

 View

 - Controller의 처리 결과 화면에 대한 정보를 보유한 객체이다.

 ViewResolver

 - Controller가 리턴한 뷰 이름을 기반으로 Controller 처리 결과를 생성할 뷰를 결정한다.

 개발자가 주로 사용하는 클래스

 - DispatcherServlet,Controller,ModelAndView,View


Spring MVC의 주요 구성 요소의 요청 처리 과정

1. 클라이언트의 요청이 DispaccherServlet에게 전달된다.

2. DispatcherServlet은 HandlerMapping을 사용하여 클라이언트의

요청을 처리할 Controller를 획득한다.(컨트롤러를 알려줌)


3. DispatcherServlet은 Controller 객체를 이용하여 클라이언트의 요청을 처리한다.


4. Controller는 클라이언트 요청 처리결과와 View페이지 정보를 

담은 ModelAndView 객체를 반환한다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

Spring IoC(Inversion of Control),Bean,의존성주입이란?  (0) 2020.07.08
프레임워크 개념  (0) 2018.01.26
MVC패턴이란?  (0) 2018.01.11
Mybatis Mapper 인터페이스란?  (0) 2018.01.11
Mybatis 셋팅이란?  (0) 2017.12.21

Mybatis Mapper 인터페이스란?


Mapper 인터페이스란?

여러 Mapper 인터페이스 작성시 설정한다.


Mapper 인터페이스란?

- 매핑파일에 기재된 SQL을 호출하기 위한 인터페이스이다.

- Mybatis 3.0부터 생겼다.

- 매핑파일에 있는 SQL을 인터페이스로 호출한다.


Mapper 사용하지않았을시?

- session.selectOne("userNS.selectUserById", id); 형식 이였다.

- 네임스페이스+"."+SQL ID 로 지정해야한다.

- 문자열로 작성하기때문에 버그가 생길 수 있다.

- IDE에서 제공하는 code assist를 사용할 수 없다.


Mapper 사용했을때

- Mapper 인터페이스 개발자가 직접작성한다.

- 패키지 이름+"."+인터페이스이름+"."+메서드이름이 네임스페이스+"."+SQL의 ID를 설정해야 한다.

- 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름 형식이다.

- SQL ID 에는 매핑하는 메서드 이름을 지정하는 것.


Mapper 인터페이스 작성

반드시 인터페이스로 선언해주어야한다.

네임스페이스 명은 패키지포함 인터페이스이름으로 작성. 

ex)<mapper namespace="myspring.user.dao.UserMapper">

메서드명은 SQLID와 동일하게작성.


사용하는법

-bean 추가

-xml네임스페이스 설정


-DAO에 autowired



-Mapper인터페이스 메소드명은 네임스페이스 ID랑 맞출것.

인터페이스

XML


여러개의 Mapper 설정 방법

- MapperScannerConfigurer사용한다.

- 위에 org.mybatis.spring.mapper.MapperFactoryBean 을 이용시 Mapper등록시 갯수가 많아지면일일이 정의해야하는 단점이 있다.

- DI컨테이너에 등록된다.

- MapperScannerConfigurer 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주된다.

dao등 인터페이스도 등록되어 에러가 생길 수 있다.


다른 인터페이스는 등록안되게 하는법

빈에 등록하기


annotation파일생성


기존 Mapper에 어노테이션 등록



'개발 소발 > 개발 Spring' 카테고리의 다른 글

SpringMVC란?  (0) 2018.01.11
MVC패턴이란?  (0) 2018.01.11
Mybatis 셋팅이란?  (0) 2017.12.21
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27

Mybatis 셋팅이란?


pom.xml에 추가한다.



1.설정해줘야한다. SqlSessionFactoryBean 

SqlSessionFactoryBean 

-DataSource(데이터베이스 커넥션)

-MyBatisConfig File(Mybatis 파일 위치정보)

(sqlMapConfig.xml)

-mapping File(쿼리SQL문을 포함)

(user.xml)



2.컴포넌트생성

(Mybatis제공 컴포넌트)

SqlSessionFactory 생성방법.




<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">

<constructor-arg ref="sqlSessionFactory" />

</bean>



3.SqlSessionFactory정보를 전달

SqlSessionTemplate(인터페이스 구현)


4.이 인터페이스를 구현한게 SqlSessionTemplate이다.

(Mybatis제공)

SqlSession(인터페이스)



SqlMapConfig.xml

vo클래스명 정리해준다.


User.xml

쿼리 포함된 mapping파일

namespace 이름 설정해준다. 


'개발 소발 > 개발 Spring' 카테고리의 다른 글

MVC패턴이란?  (0) 2018.01.11
Mybatis Mapper 인터페이스란?  (0) 2018.01.11
MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP어플리케이션 작성 (XML)이란?  (0) 2017.11.24

+ Recent posts