Spring - @Autowired / DataSource 가져오는 방법

S.Sun·2024년 4월 8일

스프링

목록 보기
7/17

질문 내용

  1. @Autowired 에 대하여 설명하시오.
  2. 아래에 대하여 설명하시오.(예습)
  • 생성자 주입
  • Setter 주입
  • 필드 주입
  1. 스프링부트에서 Datasource를 가져오기 위한 방법은?(해당 라이브러리 정리)
  • Datasource 관련 테스트 코드를 작성하시오.

개인 작성

@Autowired
- 의존성 주입 수행
- Spring이 해당 타입의 빈을 넣어주는 것
- DI(Dependency Injection)
- 사용 방법 : 객체 생성 방법과 유사한 모습을 보인다.
- 필드 주입
- 생성자 주입
- 메서드 주입(Setter)

@Autowired의 사용 방법

  • 필드 주입: 필드에 @Autowired 에너테이션을 선언하여 스프링이 해당 타입의 빈을 자동으로 주입
@Autowired
private MyService myService;
  • 생성자 주입: 생성자에 @Autowired 에너테이션을 사용.
@Autowired
public MyClass(MyService myService) {
    this.myService = myService;
}
  • 메서드 주입: 메서드에 @Autowired 에너테이션을 사용. 주로 setter 메서드 사용
@Autowired
public void setMyService(MyService myService) {
    this.myService = myService;
}

pom.xml에 관련 라이브러리가 있고

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>

application.properties에서 관련 설정을 해놨다면

#datasource (oracle)
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=scott
spring.datasource.password=tiger

해당 테스트 파일을 실행했을 때 에러가 발생하지 않는다.

package edu.sejong.ex.database;


import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

// 데이터소스(커넥션 풀 테스트)
// 테스트를 위한 웹 프로그래밍 환경 구축
@SpringBootTest
class DataSourceTest {

	// 커넥션 풀 객체
	// 주입 키워드	
	@Autowired
	private DataSource dataSource; 
	
	
	@Test
	void testConnection() {
		assertNotNull(dataSource);
		
		System.out.println("DS = " + dataSource);
		
		try(Connection conn = dataSource.getConnection()) {
			System.out.println("conn = " + conn);
			
            // conn의 데이터 타입이 Connection인가?
            // Connection 클래스의 인스턴스인지 아닌지를 확인하는 것.
			assertThat(conn).isInstanceOf(Connection.class);
			
			// Statement stmt = conn.createStatement();
			// ResultSet rs = stmt.executeQuery("select 100 from dual");
			
			PreparedStatement pstmt = conn.prepareStatement("select 100 from dual");
			ResultSet rs = pstmt.executeQuery();
			
			if(rs.next()) {
				System.out.println(rs.getLong(1));
				assertEquals(100, rs.getLong(1));
			}
			
			// stmt.close();
			pstmt.close();
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

테스트 실행 결과(붉은 줄로 표시한 부분 : 콘솔로 나오도록 표현한 메세지)

profile
두리둥둥

0개의 댓글