반응형

mapper 등록하기

xml 설정

매퍼는 다음처럼 XML설정파일에 MapperFactoryBean을 두는 것으로 스프링에 등록된다.

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean은 SqlSessionFactory 나 SqlSessionTemplate가 필요하다. sqlSessionFactory 와 sqlSessionTemplate 프로퍼티를 셋팅하면 된다. 둘다 셋팅하면 SqlSessionFactory가 무시된다. 세션 팩토리 셋은 SqlSessionTemplate이 필요하고 MapperFactoryBean는 팩토리를 사용할것이다.

자바 설정


@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
  SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
  sqlSessionFactory.setDataSource(dataSource());
  return (SqlSessionFactory) sqlSessionFactory.getObject();
}

@Bean
public UserMapper userMapper() throws Exception {
  SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
  return sessionTemplate.getMapper(UserMapper.class);
}

마이바티스의 디폴트 SqlSession에서 매퍼를 리턴받을수 없다. 디폴트 SqlSession은 쓰레드에 안전하지 않고 생성된 SqlSession이 닫힐때까지만 살아있기 때문이다. 대신 샘플코드에서 보여주는 것처럼 SqlSessionTemplate 를 사용해야만 한다

mapper 스캐닝

위는 매퍼를 수동으로 등록하는 방법이고, 정상적이라면 mapper 를 스캔해서 등록해야 한다.
스캔방법에는 3가지가 있다.

    1. mybatis:scan/ 엘리먼트 사용
    1. @MapperScan 애노테이션 사용
    1. 스프링 XML파일을 사용해서 MapperScannerConfigurer를 등록

1. mybatis:scan/ 엘리먼트 사용

'mybatis:scan/' XML엘리먼트는 스프링에서 제공하는 'context:component-scan/' 엘리먼트와 매우 유사한 방법으로 매퍼를 검색할 것이다.

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
  <mybatis:scan base-package="org.mybatis.spring.sample.mapper" />
</beans>

2. @MapperScan 애노테이션 사용

@Configuration 을 사용해서 사용해야 한다.

@Configuration
@MapperScan("org.mybatis.spring.sample.mapper")
public class AppConfig {

  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().addScript("schema.sql").build()
  }
  @Bean
  public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    return sessionFactory.getObject();
  }
}

3. 스프링 XML파일을 사용해서 MapperScannerConfigurer를 등록

MapperScannerConfigurer

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>

참고문헌

http://www.mybatis.org/spring/ko/mappers.html

반응형
반응형

SqlSessionFactory

SqlSessionFactory는 데이터베이스와의 연결과 SQL의 실행에 대한 모든 것을 가진 가장 중요한 객체다.
이 객체가 DataSource를 참조하여 MyBatis와 Mysql 서버를 연동시켜준다.

SqlSessionFactory를 생성해주는 SqlSessionFactoryBean 객체를 먼저 설정하여야 한다.
root-context.xml

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
</bean>

cofing

MyBatis는 SQL Mapping 프레임워크로 별도의 설정 파일을 가질 수 있다.
src/main/resources에 mybatis-config.xml 파일을 추가

<!-- mybatis-config.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

</configuration>

Mybatis에 별도의 설정을 주고 싶으면 위의 파일을 이용
root-context.xml의 sqlSessionFactory에 다음과 같이 configLocation 속성을 추가

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
</bean>

설정파일이 필요한 다른 이유는 마이바티스 XML파일이 매퍼 클래스와 동일한 클래스패스에 있지 않은 경우이다. 이 설정을 사용하면 두가지 옵션이 있다.
첫번째는 마이바티스 설정파일에 섹션을 사용해서 XML파일의 클래스패스를 지정하는 것이다.
두번째는 팩토리 빈의 mapperLocations 프로퍼티를 사용하는 것이다.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
</bean>

Test

SqlSessionFactory를 이용해 MyBatis와 Mysql 서버가 제대로 연결되는지 테스트
rc/test/java 폴더에 MyBatisTest라는 파일 생성

public class MyBatisTest {
    //SqlSessionFactory 객체를 자동으로 생성
    @Inject
    private SqlSessionFactory sqlFactory;
    //SqlSessionFactory 객체가 제대로 만들어졌는지 Test
    @Test
    public void testFactory() {
        System.out.println(sqlFactory);
    }
    //MyBatis와 Mysql 서버가 제대로 연결되었는지 Test
    @Test
    public void testSession() throws Exception{
        try(SqlSession session = sqlFactory.openSession()){
            System.out.println(session);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

API 문서

https://mybatis.org/mybatis-3/apidocs/org/apache/ibatis/session/SqlSessionFactory.html

참고문헌

http://www.mybatis.org/spring/ko/factorybean.html

반응형
반응형

STS > File > New > Spring Starter Project
Intellij > File > new > project > Spring Initializr

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

maven으로 프로젝트 빌드

프로젝트 우클릭 > Run as > maven clean > maven install > maven build.. > Spring boot app 으로 프로젝트 시작

~

~

Application 클래스의 main 메소드가 시작된다.
이 때 해당 클래스 명이 아니더라도 @SpringBootApplication 어노테이션이 있는 클래스의 main 메소드가 실행됨

@SpringBootApplication

어노테이션은 이 3개의 어노테이션을 모두 담고 있는 어노테이션이다.

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

스프링부트가 나오기 전까지는 ViewResolver를 설정하기 위해서 application-context.xml이 servlet-context.xml에
추가하거나, JavaConfig 기반의 환경일 경우, @Configuration 클래스 - WebMvcConfig등의 클래스 - 에 ViewResolver설정을 해줘야 했었다.

먼저 간단한 Controller 클래스를 만드는데, 클래스가 만들어지는 위치가 중요하다.
스프링부트는 메인클래스의 설정에 의해 컴포넌트스캔을 한다고 했었는데,
스프링부트는 컴포넌트 스캔을 할 때, 기본적으로 메인클래스가 있는 위치를 기준으로 스캔을 하게된다.

ComponentScan 

만약, AutoScan이 되어야 하는 컴포넌트 클래스들 - 대표적으로 @Controller, @Service, @Repository, @Component등-의 위치가 메인클래스가 위치한 패키지보다 상위 패키지에 있거나, 하위가 아닌 다른 패키지에 있는 경우, 스캔이 되지 않는다.

이런 문제를 해결하기 위해서는,
명시적으로 ComponentScan을 할 Base Package를 지정해주면 된다.

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
메인클래스에 Annotation을 추가함으로써 SpringBoot시작시 실행되는 Auto Configuration 작업중 DatatSource 설정부분을 제외시킬 수 있다.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})  // Datasource설정은 자동설정에서 제외
@ComponentScan(basePackages = "com.boilerPlate.app")

 

SpringBootApplication문서

 

반응형
반응형

빈 라이프사이클 관리

  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

+ Recent posts

Buy Me A Coffee
방문해주셔서 감사합니다. 후원이 큰힘이 됩니다.