개발이 취미인 사람

[Spring Boot] 구조 분석 (3) - @Autowired(의존관계 주입) 본문

백앤드(Back-End)/Spring Boot

[Spring Boot] 구조 분석 (3) - @Autowired(의존관계 주입)

RyanSin 2023. 4. 16. 06:09
반응형

- 지난 시간

안녕하세요. 지난 시간에는 Spring Container에 대해 알아봤습니다.

 

놓치고 오신 분들은 아래 링크를 통해 학습하고 오시는 걸 추천드리겠습니다.

[Spring Boot] 구조 분석 (2) - 스프링 컨테이너

 

[Spring Boot] 구조 분석 (2) - 스프링 컨테이너

- 지난 시간 안녕하세요. 지난 시간에는 @SpringBootApplication에 대해 알아봤습니다. @SpringBootApplication에 대해 대한 아주 기본적인 용어와 많은 내용을 담고 있기 때문에 꼭 학습하고 오시는 걸 추천

any-ting.tistory.com

 

- 개요

이번 시간에는 @Autowired Annotiation의 대해 알아보겠습니다.

 

Spring Boot 프레임워크에는 스프링 컨테이너가 존재합니다. 지난 시간에는 @Configuration 어노테이션을 활용해서 우리가 원하는 클래스를 @Bean의 등록을 했습니다.

 

@Autowired는 @Configuration을 사용하지 않고 의존관계를 자동으로 설정합니다.(말로만 하면 이해가 안 가니깐... 바로 진행하겠습니다.)

 

- UserDiskRepository 컨테이너 등록

테스트를 위해 UserDiskrepository 클래스를 생성하겠습니다. 로직을 처리하는 코드는 동일하지만 @Component를 선언해서 해당 클래스가 스프링 컨테이너에 등록될 수 있게 만들어 줍니다.

 

이전 UserMemoryRpository에서는 @Component를 사용하지 않고 실제 @Configuration 어노테이션을 사용해 컨테이너의 등록했습니다.

//UserDiskrepository
package com.ryan.spring_boot_rest_api.repository;

import com.ryan.spring_boot_rest_api.domain.User;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component //해당 클래스를 스프링 컨테이너에 등록
public class UserDiskRepository implements UserRepositoryInterface{

    Map<Integer, User> diskDB = new ConcurrentHashMap<>();

    /**
     * @author Ryan
     * @description 유저 등록
     *
     * @param id 유저 아이디
     * @param name 유저 이름
     *
     * @return id 유저 아이디
     */
    @Override
    public int save(int id, String name){

        User user = new User();
        user.setId(id);
        user.setName(name);

        this.diskDB.put(id, user);

        return id;
    }
...

//UserMemoryRepository
package com.ryan.spring_boot_rest_api.repository;

import com.ryan.spring_boot_rest_api.domain.User;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class UserMemoryRepository implements UserRepositoryInterface{

    Map<Integer, User> memoryDB = new ConcurrentHashMap<>();

    /**
     * @author Ryan
     * @description 유저 등록
     *
     * @param id 유저 아이디
     * @param name 유저 이름
     *
     * @return id 유저 아이디
     */
    @Override
    public int save(int id, String name){

        User user = new User();
        user.setId(id);
        user.setName(name);

        this.memoryDB.put(id, user);

        return id;
    }
...

 

- UserDiskRepository 의존관계 주입

이제 UserService의 UserDiskRepository를 자동으로 의존관계를 주입해 보겠습니다.

 

아주 간단합니다. @Autowired를 해당 필드 클래스에 선언하면 됩니다.

package com.ryan.spring_boot_rest_api.service;

import com.ryan.spring_boot_rest_api.domain.User;
import com.ryan.spring_boot_rest_api.dto.CreatUserDto;
import com.ryan.spring_boot_rest_api.dto.SuccessResponse;
import com.ryan.spring_boot_rest_api.dto.UpdateUserDto;
import com.ryan.spring_boot_rest_api.repository.UserDiskRepository;
import com.ryan.spring_boot_rest_api.repository.UserRepositoryInterface;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepositoryInterface userRepository;

    @Autowired
    private final UserDiskRepository userDiskRepository;


    /**
     * @author Ryan
     * @description 유저 생성 컨트롤러
     *
     * @path /user/create
     *
     * @return User Id
     */
    public SuccessResponse onCreateUser(CreatUserDto creatUserDto){

        int id = creatUserDto.getId();
        String name = creatUserDto.getName();

        int userId = this.userDiskRepository.save(id, name);

        return new SuccessResponse(true, userId);
    }

	...
}

 

위와 같이 @Autowired를 통해 스프링컨테이너의 등록된 해당 클래스와 연결해서 사용할 수 있습니다.

실제 포스트맨으로 API를 호출해도 로직에서는 큰 문제가 없는 걸 확인할 수 있습니다.

 

유저 생성 API 호출

이번 시간에서 가장 중요한 부분은 @Component와 @Autowired 어노테이션입니다.

 

@Component - 스프링 컨테이너에 해당 클래스를 빈으로 등록한다.

@Autowired - 등록된 빈의 대한 정보를 자동으로 주입한다.

 

스프링을 공부하고 사용하면서 매번 느끼는 부분은 DI 프레임워크에 원리가 해당 프레임워크가 지원하는 장점과 단점을 잘 알고 있어야 실무에서 잘 활용할 수 있다는 것입니다.

 

실제 하나씩 코드를 작성하면서 꼭 실습을 하시는 걸 추천드리겠습니다.

 

소스 코드

https://github.com/Ryan-Sin/Spring_Boot_Rest_API/tree/v3

 

GitHub - Ryan-Sin/Spring_Boot_Rest_API: Spring Boot RESTful API 프로젝트

Spring Boot RESTful API 프로젝트. Contribute to Ryan-Sin/Spring_Boot_Rest_API development by creating an account on GitHub.

github.com