SPRING January 10, 2021

spring-05 애너테이션(annotation) 사용

Words count 7.5k Reading time 7 mins.

애너테이션 사용

애너테이션이란

  • 스프링 애너테이션(Annotation)

    기존에 XML에서 하던 빈 설정을 애너테이션을 이용해서 자바 코드에서 설정하는 방법

    기능이 복잡해짐에 따라 XML에서 설정하는 것보다 유지 보수가 유리하다.

    현재 애플리케이션 개발 시 XML 설정 방법과 애너테이션 방법을 혼합해서 사용한다.

@Configuration

app-context.xml 하고 같은 일을 하는 클래스이다.

실전문제

app-context.xml 이 없는 ver

Song.java

package com.koreait.spring;

public class Song {

    // field

    private String title;
    private String genre;

    // constructor

    public Song() {


    }

    public Song(String title, String genre) {
        super();
        this.title = title;
        this.genre = genre;
    }

    // method

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public void songInfo() {
        System.out.println(title + "(" + genre + ")");

    }
}

title genre 필드를 만들고 getter setter, 그리고 generate Constructor using fiends 까지 해준다


singer.java

package com.koreait.spring;

public class Singer {


    // field
    private String name;
    private Song song;

    //constructor

    public Singer() {
        // TODO Auto-generated constructor stub
    }

    public Singer(String name, Song song) {
        super();
        this.name = name;
        this.song = song;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Song getSong() {
        return song;
    }

    public void setSong(Song song) {
        this.song = song;
    }

    public void singInfo() {
        System.out.println("이름:" + name );
        song.songInfo();

    }
}

private Song song 해줌으로써 songInfo(); 를 가져온다


Java 스타일 메인

package com.koreait.spring;

public class MainClass {

    public static void main(String[] args) {

        Song song = new Song();
        song.setTitle("Dynamite");
        song.setGenre("댄스");

        Singer singer =new Singer();
        singer.setName("BTS");
        singer.setSong(song);

        singer.singInfo();


    }

}

Spring Style Main

AppContext.java

중요!! xml 을 대신한다.

package com.koreait.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 애너테이션 사용

/*
*  @Configuration
*  
*  : 나는 app-context.xml 하고 같은일을 하는 클래스 이다..
* 
*/


@Configuration
public class AppContext {

   // 메소드 하나당 Bean을 하나 씩 만듭니다.
   // Bean 을 만드는 메소드들은 @ 애너테이션을 추가해야 한다.

   /*
    *  <bean id="song1" class="com.koreait.spring.Song">
    *  
    *  <property name="title" value="Dynamite" />
    *  <property name="genre" value="댄스" />
    *  </bean>
    *  
    *  아래 메소드를 위 <bean> 태그와 같은 일을 한다.
    * 
    */

   @Bean   // 이 메소드는 Bean 을 만드는 메소드 입니다.
   public Song song1() {
       Song song = new Song();                    // <bean id="song1" class="com.koreait.spring.Song">
       song.setTitle("Dynamite1"); //  <property name="title" value="Dynamite" />
       song.setGenre("댄스1");  // <property name="genre" value="댄스" />
       return song;

   }
   /*
    <bean id="song2" class="com.koreait.spring.Song">

      <constructor-arg value="Dynamite" />
      <constructor-arg  value="댄스" />
      </bean>

       아래 메소드는 위 <bean> 태그와 같은 일을 한다.
   */
   @Bean(name="song2")  // @Bean(name="bean의 id")
    public Song zzzzz() {  // 메소드의 이름 zzzz는 사용되지 않아요.
       return new Song("Dynamite2", "댄스2");
   }

   /*
    <bean id="singer1" class="com.koreait.spring.Singer">

      <property name="name"  value="BTS" />
      <property  name="song"  ref="song1" />
      </bean>

       아래 메소드는 위 <bean> 태그와 같은 일을 한다.
   */

   @Bean
   public Singer singer1() {

       Singer singer = new Singer();
       singer.setName("BTS3");
       singer.setSong(song1());  // public Song song1(){} 메소드를 호출하면 song1 이라는 Bean 이 반환됩니다.
       return singer;

   }

   /*
    <bean id="singer2" class="com.koreait.spring.Singer">

            <constructor-arg value="BTS" />
      <constructor-arg  ref="song2" />
      </bean>

       아래 메소드는 위 <bean> 태그와 같은 일을 한다.
    */
   @Bean
   public Singer singer2() {
       return new Singer("BTS4", zzzzz());  // public Song zzzzz(){} 메소드를 호출하면 song2 라는 Bean 이 반환
   }

}

SpringMainClass.java

package com.koreait.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

public class SpringMainClass {

    public static void main(String[] args) {


        // @Configuration 애너테이션을 추가한 AppContext.java 를
        // 처리하는 클래스는 AnnotationConfigApplicationContext 입니다.

        // AnnotationConfigApplicationContext 클래스는 AbstractApplicationContext 클래스의 서브클래스 입니다.

        AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);

        Song s1 = ctx.getBean("song1", Song.class);

        Song s2 = ctx.getBean("song2", Song.class);

        s1.songInfo();
        s2.songInfo();

        Singer gasu1 = ctx.getBean("singer1", Singer.class);
        Singer gasu2 = ctx.getBean("singer2", Singer.class);

        gasu1.singInfo();
        gasu2.singInfo();

        ctx.close();
    }

}

AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
부분 중요

결과화면

0%