10/17

오늘은 AWS 에 데이터베이스 연결하고 인텔리제이에 연결하여 인텔리 제이에서 바로 터미널 접속 가능케 세팅
하는 것을 하고 , myBatis를 배우기 전에 스프링 내부에서 어떠한 일들이 일어나고 그 기능을 해주는 어노 테이션
들에 대해 배웠다.

 

@SpringBootApplication 

SpringBootApplication은 main 메소드가 있는 class의 패키지와 그 하위 패키지를 스캔 하여 class에 @Compornent
라 붙어 있는 class들을 객체(instance) 생성 하라고 명령하는 어노테이션 이다.

 

@Compornent

  • 위에서 서술 하였듯이 springbootapplication이 알아보게 해주는 어노테이션 이다.
  • Compornent로 생성한 객체(instance)들을 저장 할때에 ApplicationContext라는 객체에 저장을 해둔다.
    • getBean으로 값을 갖고 와 context 에 저장하고, 불러올 때에는 항상 같은 참조에서 불러온다.
  • Compronent를 사용하여 만들어진 객체(instance)를 Spring Bean 이라고 한다.
  • Spring Bean을 직접 꺼내서 쓸때는 형변환을 하는일이 자주 일어나기때문에 getBean method에서 바로
    형 변환 타입을 지정 해줄 수도 있다.
context.getBean("스프링 빈 이름", 형변환할 타입)
  • Compornent에 spring Bean의 이름을 명시하지 않으면 클래스의 이름을 LowerCamelCase로 변환하여 사용한다.
@Compornent ("사용할 이름")
class ComMethod {}
@Compornent
class ComMethod {}
// 안 적으면 comMethod 라고 사용한다.

 

@Autowired

Autowired를 사용 하기 위한 조건 ▼

Spring Bean클라스에 의존성이 잇는 필드를 메소드에 사용 한다면 생성자와 setMethod가 있어야 하고 setMethod를 사용 하기 위해 기본 생성자도 만들어 주어야 한다.

그런데 필드의 값을 우리가 제어(넣어주는)하는 것이 아닌 spring에서 제어해 주길 바란다면 생성자(constructor)나
setMethod 에 @Autowired 어노테이션을 붙여주어 사용하고, 이것을 의존성 주입(Dependency Injection)이라고 한다.

  • 제어를 우리가 아닌 spring 이 해서 Inversion Of Control 이라고 한다.
  • spring이 우리 모르게 하는것을 IOC control이라고 한다.
  • @Autowired는 필드에 주입 가능 하지만 권하지는 않는다.
  • @Autowired는 생성자가 1개만 존재할때에 작성 하지 않아도 자동으로 주입이 된다.

 

@RequiredArgsConstructor

  • 의존성 주입 필드가 final필드 일 경우에 사용 하는 어노테이션 (final 필드는 무조건 값을 1번 받아야 하므로)
  •  lombok의 어노테이션 이고 자동으로 생성자를 생성해주어 생성자를 따로 작성 하지 않아도 되게 해준다.

 

@Qualifier

  • Spring Bean 클래스의 의존성 필드를 다형성으로 사용한경우 에 사용 
  • Spring이 어떤것을 받아 올지 모르기때문에 사용할것을 지정해주는 어노테이션
interface MyInterface1 {

}

@Component
class MyClass18 implements MyInterface1 {

}

@Component
class MyClass19 implements MyInterface1{

}

@Component
//@RequiredArgsConstructor
class MyClass17 {
    private final MyInterface1 field;

    public MyClass17(@Qualifier("myClass18") MyInterface1 field) {
        // interface field에 주입될 클래스가 여러개라면 @Qualifier어노테이션을 붙여 명시해주어야 한다.
        this.field = field;
    }
}

 

@PostConstruct

  • 의존성 주입을 해주고 초기화 하는것 
  • 웹 어플리케이션이 실행 될 때에 자동으로 실행 될  수 있게 해주는 어노테이션
  • 예를 들면 DB에 연결하는 설정이 있는 코드라면 어플리 케이션이 실행됨과 동시에 실행 되어야 하기 때문에 
    이때에 postConstruct 어노테이션을 사용하여 자동 실행 시킨다.

 

@Configuration / @Bean

  • 다른사람이 만든 class에 @Compornent 어노테이션이 없을 경우 Bean으로 만들어 사용하고 싶을때 쓰는
    어노테이션 이다.
  • 새로운 클래스를 생성하여 @Configuration 어노테이션을 붙여주고 그안에 Bean으로 만들고 싶은 다른 
    클래스를 타입으로 받아오는 메소드를 작성 하고 그 메소드에 @Bean 어노테이션을 붙여 사용 한다.
@Configuration
class Configuration2 {
    @Bean
    public MyClass29 myClass29() {
        return new MyClass29();
    }

    @Bean
    public MyClass28 myClass28() {
        MyClass28 myClass28 = new MyClass28();
        myClass28.setField(myClass29());
        return myClass28;
    }
}

class MyClass29 {

}

class MyClass28 {
    private MyClass29 field; // dependency

    public void setField(MyClass29 field) {
        this.field = field;
    }

    public MyClass29 getField() {
        return field;
    }
}
  • 여기서 myClass29 를 new 로 새로 운 객체를 생성하더라도 불러올때에 같은 객체 주소를 불러오는 이유는
    SpringBean이 실행되면 재정의 된 메소드가 실행되고 (해당 메소드가 실행 될 때마다 같은 객체가 나오는
    것을 보장 하도록) 다시 쓰여졌기 때문에 같은 객체가 나온다 -> 나오는 객체각 1개이도록 하는것을 (싱글톤
    패턴) 이라고 한다.

 

※ 지금까지 위의 어노테이션이 무슨역할을 하는지 배웠고 Mybatis를 이용해 더 간략하게 코드를 작성할 수 있게
배울 예정이다.

 

MyBatis

@Mapper

  • Mapper 어노테이션은  MyBatis의 어노테이션 이다
  • Mapper가 붙은 클래스로 컴포넌트를 자동으로 생성해준다.
  • 쿼리는 직접 작성해야 한다.

※ 결론 : 쿼리를 잘 작성해야하고, 파라미터를 잘 작성, 리턴타입만 잘 하면 된다.

 

 

단순하게 스프링 어노테이션들이 하는일을 넘겨 배운것이 아니라 뒤에서 어떠한
기능을 하는지 스프링 코드를 작성하면 배워서 그런지 더 어려웠던 느낌이었다.

 

열심히 공부하자...

 

 

+ Recent posts