Spring Bean 실전 코드

김경혜·2024년 10월 8일
0

Spring Bean : Spring에 java 객체의 생명주기를 맡겨버리는 것

아래의 코드처럼 생긴 것 들은 spring bean을 주입 받아서 사용하는 코드들

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service					// 얘는 주입시에는 상관 없음, 본인이 spring bean이 되는  것
@RequiredArgsConstructor	// 얘가 주입시켜주는 어노테이션 (생성자주입)
public class MyService {
	// MyRepository가 반드시 spring bean 등록이 되어있어야 함!!!
    private final MyRepository myRepository;	// final 꼭!! 있어야함!!!
}
@Service					// 얘는 주입시에는 상관 없음, 본인이 spring bean이 되는  것
public class MyService {
	// MyRepository가 반드시 spring bean 등록이 되어있어야 함!!!
    @Autowired
    private MyRepository myRepository;
}

java 내에서 Spring Bean으로 등록할 수 있는 방법

1. 자바 어노테이션 기반 정의 : @Configuration과 @Bean 어노테이션을 사용

  • @Configuration 아래의 메소드 위에 @Bean이 있어야 함
@Configuration	// Bean 정의를 위한 소스로 인식하게 하는 어노테이션
public class AppConfig {
    @Bean	// 꼭 올리고 싶은 java class를 리턴하는 메소드를 만들고 그 위에 달아야함
    public MyBeanClass myBean() {
        return new MyBeanClass();
    }
}

2. @Component, @Service, @Repository, @Controller 등의 어노테이션을 사용

  • 위의 어노테이션들은 java class 위에 설정
  • @Controller : 프레젠테이션 계층(웹 컨트롤러)
  • @Service : 비즈니스 로직을 처리하는 서비스 계층
  • @Repository : 데이터 액세스 계층(DAO, Data Access Object)
    - 현재 프로젝트에서는 이거 대신 @mapper로 바로 붙히는 것 같아용
  • @Component : 위의 경우가 아닌 것들을 Bean으로 넣고 싶을 때
@Component
public class MyBeanClass {
	// class 안에 내용`~
}

3. Mybatis의 @Mapper 사용

이건 Spring 자체 기능이 아니라 먼저 dependendy 설정 필요

  • @Mapper가 위치한 패키지들을 Scan해주는 @MapperScan 필요
  • @Mapper는 사용할 인터페이스 위에 사용
  • sql.xml파일과 연결
@SpringBootApplication
@MapperScan("com.example.mapper") // 매퍼 인터페이스가 위치한 패키지
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
package com.example.mapper;

@Mapper		// 사용할 인터페이스 위에 사용
public interface UserMapper {
    User findById(int id);
    List<User> findAll();
}
<!-- @Mapper된 경로랑 같아야 함 -->
<mapper namespace="com.example.mapper.UserMapper">
    
    <select id="findById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
    
    <select id="findAll" resultType="com.example.model.User">
        SELECT * FROM users
    </select>

</mapper>

xml기반 빈 등록도 있는데 이번엔 안 쓰는 것 같아서 일단 제외입니당

profile
안녕하세요!

0개의 댓글

관련 채용 정보