반응형

빈 라이프사이클 관리

  1. 인터페이스 기반
    InitializingBean 인터페이스 구현한 afterPropertiseSet 메소드
    모든 인스턴스의 콜백을 한번에 지정 가능, 스프링과 결합을 해야함

  2. 빈 생성시 메소드 실행
    init-method
    빈의 메서드 하나를 지정해 초기화 콜백으로 사용하겠다고 스프링에 설정
    빈이 몇개 안되거나 애플리케이션이 스프링과 결합되지 않게 할 때 유용
    인자를 받지 못하는 것이 단점
    init 메소드는 private 으로 사용 권고

  3. 애너테이션 사용
    @PostConstruct
    사용법은 init-method 와 동일하고 @PostConstruct 만 메소드 상단에 추가
    메소드명은 아무이름이나 사용 가능
    init 메소드는 private 으로 사용 권고
    @Bean으로 초기화메소드 사용
    @Bean 애너테이션에 initMethod 추가
    @Bean(initMethod = "init")

소멸시점

  1. bean 태그에 destroy-method 애트리뷰트 추가하고 메소드 이름 기입
    @Bean 을 사용해 메소드 정의
    @Bean(destroyMethod="destroy")

  2. DisposableBean 인터페이스를 구현한 destroy 메소드

  3. @PreDestroy 애너테이션

    BeanNameAware 인터페이스

    라이프사이클 콜백 호출전 setBeanName() 메소드를 호출
    BeanNameAware 인터페이스를 사용해 생성자등에 로그메시지를 넣기 좋음

반응형
반응형

포인트컷 표현식

execution() : 가장 대표적이고 강력한 지시자로, 접근제어자, 리턴 타입, 타입 패턴, 메서드, 파라미터 타입, 예외 타입 등을 조합해서 메서드까지 선택가능한 가장 정교한 포인트컷을 만들수 있다.
execution([수식어] 리턴타입 [클래스이름].이름(파라미터)

execution(public Integer com.edu.aop.*.*(*))
 - com.edu.aop 패키지에 속해있고, 파라미터가 1개인 모든 메서드

execution(* com.edu..*.get*(..))
 - com.edu 패키지 및 하위 패키지에 속해있고, 이름이 get으로 시작하는 파라미터가 0개 이상인 모든 메서드 

execution(* com.edu.aop..*Service.*(..))
 - com.edu.aop 패키지 및 하위 패키지에 속해있고, 이름이 Service르 끝나는 인터페이스의 파라미터가 0개 이상인 모든 메서드

execution(* com.edu.aop.BoardService.*(..))
 - com.edu.aop.BoardService 인터페이스에 속한 파마리터가 0개 이상인 모든 메서드

execution(* some*(*, *))
 - 메서드 이름이 some으로 시작하고 파라미터가 2개인 모든 메서드

within() : 타입 패턴만을 이용하여 조인포인트를 정의한다.

within(com.edu.aop.SomeService)
 - com.edu.aop.SomeService 인터페이스의 모든 메서드

within(com.edu.aop.*)
 - com.edu.aop 패키지의 모든 메서드

within(com.edu.aop..*)
 - com.edu.aop 패키지 및 하위 패키지의 모든 메서드

this : 빈 오브텍트의 타입의 조인포인트를 정의한다.
target : 대상객체의 타입 비교를 이용한 조인포인트를 정의한다.
args : 메서드의 파라미터 타입만을 이용하여 조인포인트를 정의한다.
@target : 특정 어노테이션이 정의된 객체를 찾는 조인포인트를 정의한다.
@args : 특정 어노테이션을 파라미터로 받는 오브젝트를 찾는 조인포인트를 정의한다.
@within : @target과 유사하게 특정 어노테이션이 정의된 객체를 찾는데, 선택될 조인포인트 메서드는 타겟 클래스에서 선언이 되어있어야 한다.
@annotation : 조인 포인트 메서드에 특정 어노테이션을 찾는 조인포인트를 정의한다.

포인트컷의 조합식에는 or, and, not 3가지를 사용할 수 있으며 각각 ||, &&, !으로 표현할 수 있음.

execution과 @annotation을 주로 사용

반응형
반응형
 @Scheduled(cron="*/30 * * * * *")

시간 설정 @scheduled(cron=" ") * 리눅스 crontab 과 같은 설정방법

@Scheduled(cron="0 0 02 * * ?") // 매일 새벽2시에 실행
@Scheduled(cron="0 0 02 2,20 * ?") // 매월 2일,20일 새벽2시에 실행

참고문헌

https://kanetami.tistory.com/entry/Schedule-Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%EC%BC%80%EC%A5%B4-%EC%84%A4%EC%A0%95%EB%B2%95-CronTab

반응형
반응형

@Resource 어노테이션

자바 표준,이름으로 찾을때

JSR-250 표준 어노테이션에 속한다.

의존성을 찾는 순서

  1. 이름
  2. 타입
  3. 지정자

@Inject 어노테이션

자바 표준,타입으로 찾을 때

JSR-330 표준 어노테이션에 속한다.

의존성을 찾는 순서

  1. 타입
  2. 지정자
  3. 이름

@Autowired 어노테이션

스프링 표준,타입으로 찾을때

@Autowired 어노테이션은 @Inject 어노테이션과 유사하다.

의존성을 찾는 순서

  1. 타입
  2. 지정자
  3. 이름

참고문헌

https://hilucky.tistory.com/254 [Spring] @Resource, @Inject, @Autowired]
https://www.baeldung.com/spring-annotations-resource-inject-autowire [영문 가이드]

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

[Spring] AOP 포인트컷 표현식  (2) 2020.05.15
[Spring] 스케쥴 설정  (0) 2020.05.15
@Autowired @Resource @Inject 차이  (0) 2020.05.10
component 과 bean 의 차이점  (0) 2020.05.10
localeResolver 란  (0) 2020.05.10
반응형

차이

  Autowired Inject Resource
범용 스프링전용 자바에서 지원 자바에서 지원
연결방식 타입에 맞춰서 연결 타입에 맞춰서 연결 이름으로 연결
강제연결 @Qualifier("title")   @Resource(name="title")
@Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결      

@Autowired

private Chicken penguin;  //Chicken 타입으로 연결

@Inject

private Penguin chicken; //Penguin 타입으로 연결

@Resource

private Chicken penguin;  //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 난다.

@Resource

private Bird penguin;      //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출

Resource를 추천.

어느 프레임워크에 종속적이지 않기 때문에

이것또한 Bean를 생성하며 싱글톤 패턴이 자동으로 적용.

타입으로 연결 하기 때문에 같은 타입인 여러개의 필드는 오류가 날 것 이다.

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

[Spring] 스케쥴 설정  (0) 2020.05.15
[Spring] @Resource @Inject @Autowired 차이  (0) 2020.05.15
component 과 bean 의 차이점  (0) 2020.05.10
localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
반응형

Bean 과 Component 의 차이점

@Bean의 경우 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
@Bean은 @Configuration으로 선언된 클래스 내에 있는 메소드를 정의할 때 사용한다. 이 메소드가 반환하는 객체가 bean이 되며 default로 메소드 이름이 bean의 이름이 된다.


@Bean

setter나 builder 등을 통해서

사용자가 프로퍼티를 변경해서 생성한 인스턴스를

Spring에게 관리하라고 맡기는 것이다.

개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Component
@Component 의 종류에는 @Repository @Service @Controller 로 나뉜다.


@Component는

클래스를 Spring에게 알아서

**인스턴스 생성**및**Bean 등록**하는 과정을 맡기는 것이다.

개발자가 생성한 Class에 @Bean은 선언은 안된다.

개발자가 생성한 class에 @Component 를 선언한다.

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

[Spring] @Resource @Inject @Autowired 차이  (0) 2020.05.15
@Autowired @Resource @Inject 차이  (0) 2020.05.10
localeResolver 란  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
servelt context 사용  (0) 2020.05.08
반응형

스프링 localeResolver

기본설정

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class I18nConfig extends WebMvcConfigurerAdapter {
    @Bean
    public LocaleResolver localeResolver() {
        // 쿠키를 사용한 예제
        CookieLocaleResolver resolver = new CookieLocaleResolver();
        resolver.setCookieName("lang");
        return resolver;
    }

    /** 언어 변경시 아래 코드 추가  */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang"); // ?lang={언어코드} 로 언어를 바꿀 수 있습니다.
        registry.addInterceptor(localeChangeInterceptor);
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/i18n/messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
}

메시지 소스 설정 파일

리소스/i18n/messages.properties (기본값)
리소스/i18n/messages_ko.properties (한국어)
리소스/i18n/messages_{언어코드}.properties

메시지 설정

리소스/i18n/messages_ko.properties
title: 타이틀(한국어)
hello: 안녕
home: 홈

리소스/i18n/messages_en.properties
hello: hello
home: home

뷰(타임리프)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title th:text="#{title}"></title>
</head>
<body>
<div>
    <h1 th:text="#{home}"></h1>
    <h2 th:text="#{hello}"></h2>
    <a href="?lang=ko">한국어</a>
    <a href="?lang=en">영어</a>
</div>
</body>
</html>

Locale Resolever

@Bean
public LocaleResolver localeResolver() {
    // 세션을 사용한 예제
//        SessionLocaleResolver resolver = new SessionLocaleResolver();
//        resolver.setDefaultLocale(Locale.KOREAN);
    // 쿠키를 사용한 예제
    CookieLocaleResolver resolver = new CookieLocaleResolver();
//    resolver.setDefaultLocale(Locale.KOREAN); // 기본값 강제 한국어 설정.
    resolver.setCookieName("lang");
    return resolver;
}

http의 해더의 Accept-Language 에 의해 선택된다.
특이하게 setLocale 가 지원되지않는다. 오직 브라우저 설정에 의해서만 설정된다.

SessionLocaleResolver

처음 들어갈때에는 AcceptHeaderLocaleResolver 처럼 브라우저의 언어 설정에 의한 Accept-Language 로 값이 결정됩니다.
물론 setDefaultLocale 을 설정한다면 해당 기본값이 최우선입니다. (다음 문단에서 설명)
세션으로 저장되며, 필자의 버전기준으로 org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE 라는 세션 속성이름으로 클래스를 시리얼라이징 되어 저장됩니다.

CookieLocaleResolver

SessionLocaleResolver와 속성이 동일하지만 lang 값이 바뀔경우 세션이 아닌 쿠키에 저장합니다.
때문에 세션의 경우 세션이 끊어지면 언어설정이 되돌아오지만 이 리졸버를 이용할 경우 쿠키에 값을 우선으로 불러옴.
CookieLocaleResolver추천

LocaleResolver.setDefaultLocale

SessionLocaleResolver 에서도 설명했지만 setDefaultLocale 을 설정할 땐 주의해야 함.
setDefaultLocale을 설정하게되면 해당 값이 의도적으로 설정된다.
즉, setDefaultLocale 의 값이 Accept-Language 보다 더 높은 우선순위에 있다.
예를들어 영어로 설정한다면 한국어 브라우저로 접속하더라도 기본값이 영어로 설정이 된다.
다만 아에 디폴트를 설정하지 않을 경우 Accept-Language 에서 가장 높은 우선순위 값이 기본값으로 설정됨.
기본값이 없을때 브라우저별 기본값을 확인해보고 싶으신경우 의도적으로 Accept-Language 값을 바꿔서 보내거나,
브라우저 설정의 인터페이스 언어 같은 것 을 다른언어로 바꾼뒤에 접근하면 된다.

LocaleResolver 의 종류

※ 스프링이 제공하는 LocaleResolver 구현 클래스

 클래스

 설 명

 AcceptHeaderLocaleResolver

 웹 브라우저가 전송한 Accept-Language 헤더로부터 Locale 선택한다. setLocale() 메서드를 지원  하지 않는다.

 CookieLocaleResolver

 쿠키를 이용해서 Locale 정보를 구한다. setLocale() 메서드는 쿠키에 Locale 정보를 저장한다.

 SessionLocaleResolver

 세션으로부터 Locale 정보를 구한다. setLocale() 메서드는 세션에 Locale 정보를 저장한다.

 FixedLocaleResolver

 웹 요청에 상관없이 특정한 Locale로 설정한다. setLocale() 메서드를 지원하지 않는다.

참고문헌

https://devbox.tistory.com/entry/Spring-Locale-처리 [spring locale처리]

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

@Autowired @Resource @Inject 차이  (0) 2020.05.10
component 과 bean 의 차이점  (0) 2020.05.10
spring webjars란  (0) 2020.05.08
servelt context 사용  (0) 2020.05.08
스프링 이해하기  (1) 2020.05.07
반응형

js 및 css 스크립트 라이브러리 로드 할 경우 방법

  1. 다운받아서 로컬에 풀기
  2. CDN 주소 사용
  3. bower, grunt, yeoman 같은 프론트 엔트 package manager 사용

WEBJARS 란

webjars 는 jar 파일로 프론트 엔트 리소스를 가져오게 하는 라이브러리이다.

결국 webjars 안에서도 bower 라는 패키지 매니저를 사용 해야함. npm도 있음.

<dependency>
    <groupId>org.webjars.bower</groupId>
    <artifactId>jquery</artifactId>
    <version>2.1.3</version>
</dependency>
<dependency>
    <groupId>org.webjars.bower</groupId>
    <artifactId>bootstrap</artifactId>
    <version>3.3.4</version>
</dependency>

사용방법

<link rel="stylesheet" href="/webjars/bootstrap/3.3.4/dist/css/bootstrap.min.css">
<script src="/webjars/jquery/2.1.3/dist/jquery.min.js"></script>
<script src="/webjars/bootstrap/3.3.4/dist/js/bootstrap.min.js"></script>

빌드를 하면 /resources 경로에 webjars 라는 경로로 라이브러리가 압축이 풀린다.

스프링부트에서는 JARs 에 있는 클래스패스 /META-INF/resources/webjars 를 /webjars 로 요청을 연결하도록 자동구성된다.

프로젝트 구성이 프론트 엔드 구성이 따로 되어 있으면 프론트 엔드 빌드 툴 사용 권장!

참고문헌

http://millky.com/@origoni/post/1147 [webjars를 이용한 bootstrap, jquery 적용해보기]

반응형

'Spring > spring framework 기본 및 이론' 카테고리의 다른 글

component 과 bean 의 차이점  (0) 2020.05.10
localeResolver 란  (0) 2020.05.10
servelt context 사용  (0) 2020.05.08
스프링 이해하기  (1) 2020.05.07
스프링 jdbc 이해하기  (0) 2020.05.07

+ Recent posts