본문으로 바로가기

[스프링]2. 어노테이션 설명

category SPRING/스프링 2021. 3. 18. 21:00
728x90
반응형
SMALL

어노테이션이 왜 생겨 났을까

프로그램이 거대해짐에 따라서 xml을 이용하여 ioc 컨테이너를 설정하는것이 점점 어려워졌고

이 때문에 어노테이션(@)이 등장하였다.

어노테이션은 코드에 메타데이터를 작성하여 직관적인 코딩이 가능하게 만들어주며 이에 따라 생산성이 증대되는 장점이 있다.

 

@Configuration:  스프링 IOC 컨테이너 에게 해당 클래스를 Bean 구성 class 라고 알려주는것

 

@Component, @Bean : 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시

왜 두개가 존재하지❓

둘의 용도가 다르기 때문

@Bean 은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할때 사용됨

@Configuration
public class ApplicationConfig{
	@Bean
    public ArrayList<String> array(){
    	return new ArrayList<String>();
    }
}

위와 같이 ArrayList와 같은 라이브러리 등을 Bean으로 등록하기 위해선 별도로 해당 라이브러리 객체를 반환하는

메서드를 만들고 @Bean 어노테이션을 붙혀준다. @Bean 에 아무런 값을 지정하지 않았으므로 메서드 이름이 Bean id가 된다.

@Configuration
public class ApplicationConfig{
	@Bean(name="yjy")
    public ArrayList<String> array(){
    	return new ArrayList<String>();
    }
}

@Bean의 name 속성을 이용하면 Bean의 id값을 지정해줄수 있다.

 

@Component 는 개발자가 직접 작성한 class를 Bean으로 등록하기 위한 어노테이션

@Component
public class Stdent{
	public Stdent(){
    	System.out.println("hi");
    }
}

Stdent 클래스는 개발자가 사용하기 위해 직접 작성한 클래스이다.

 

 

 

 

@Setter(onMethod = @_({ @Autowired })) :

@Setter : setter 메서드를 생성해주는 역할

@Autowired : 해당 인스턴스 변수를 스프링으로 부터 자동으로 주입해달라는 표시


자바 클래스에서 @Autowired 를 선언해줌으로서 불필요한 xml 설정을 피할수 있게된다.

컨트롤러 클래스에서의 어노테이션 setter 주입

 

xml 파일에서의 setter 주입 설정

db접속을 위한 xml 설정도 마찬가지로`

xml 파일

 

해당 클래스인 JDBCNoticeService 로 가서 어노테이션 설정 하나만으로 주입시켜줄수 있다.

클래스 파일

물론 xml은 수정되어야한다.(그전 xml 주입문은 지워야함@Component : 스프링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시

 

해당 클래스 안의 setter만 어노테이션 처리 했다면 이번에는 클래스 전체를 어노테이션으로 대체할수 있는 방법을 해보자.

xml파일

기존 JDBCNoticeService 라는 클래스가 xml 형식으로 주입되었으나 이것을 주석처리 한 후

<context:component-scan base-package="com.newlecture.web.service"></context:component-scan>

해당 컴포넌트 스캔을 사용해서 JDBCNoticeService가 속한 패키지 경로까지만 지정해주자.

Component 어노테이션을 써서 클래스 파일을 객체로 만들어 쓰기 위해서 스캔으로  찾아서 쓴다 
    <context:annotation-config />기능 또한 스캔 안에 있기 때문에 선언 안해줘도된다.

package com.newlecture.web.service.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.newlecture.web.entity.Notice;
import com.newlecture.web.service.NoticeService;

@Service //@Component 는 @Controller, @Service, @Repository 로 구분해서 사용할 수 있다.
public class JDBCNoticeService implements NoticeService {
//	private String url = "jdbc:oracle:thin:@localhost:1521/XE";
//	private String uid = "NEWLEC";
//	private String pwd = "11111";
//	private String driver = "oracle.jdbc.driver.OracleDriver";
	
	@Autowired
	private DataSource dataSource;

해당 클래스에서는 @Component 로 어노테이션을 사용해서 클래스 자체를 사용할 수 있게된다.

 

@ComponentScan : 어노테이션이 부여된 클래스들을 자동으로 스캔하여 bean으로 등록해주는 역할

@Runwith(SpringJUnit4ClassRunner.class) : 현재 코드가 스프링을 실행하는 역할을 할 것

@ContextConfiguration : 지정한 클래스나 문자열을 이용해서 필요한 객체들을 스프링 내에 객체로 등록

@Log4j : lombok을 이용해서 로그를 기록하는 것

@Service : 계층 구조상 주로 비즈니스 영역을 담당하는 객체임을 표시하기 위해

@AllArgsConstructor : 모든 파라미터를 이용하는 생성자를 만들어 주는것

@RequiredArgsConstructor : final 이나 @NonNull 인 필드값만 파라미터로 받는 생성자를 만들어준다링에게 해당 클래스가 스프링에서 관리해야 하는 대상임을 표시

 

@RequestMapping : 요청에 대해 어떤 Controller , 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션

@ResponseBody :직접 텍스트를 출력하는법, 뷰 리솔버를 통해서 RequestMapping 의 반환값+.jsp를 찾지말고 그자체로 리턴해주는 순수값을 받는다. 예제를 보며 확인하자

public class HomeController /*implements Controller*/{

	@RequestMapping("index") //매핑구문 안에 구문을 저절로 찾아서 url리솔빙을 해준다.
	@ResponseBody  //(1.직접 텍스트를 출력하는법)뷰 리솔버를 통해서 반환값.jsp 를 찾지말고 그자체로 순수반환값을 받아라
	public String index(HttpServletResponse response) {
		return "hello index";
	}

 

 

 

참고:

galid1.tistory.com/494

728x90
반응형
LIST