백앤드/SpringBoot + Java 간간한 백앤드 예제

[SpringBoot + Java] 간단한 백엔드(Spring Bean)

맏리믓 2023. 7. 18. 15:39

들어가며

- Controller 는 말 그대로 프로젝트를 컨트롤 하는 역할이다.

- 무슨 말인가 하면 Contoller 가 Service, Repository 등을 사용해 기능을 수행 한다.

 

- 이 때 자바를 배운 사람이라면 Service 를 사용 하기 위해서 new 를 통해 class 를 생성하고 사용 할 것이다.

- 하지만 이렇게 한다면 A_Controller 와 B_Controller 에서 같은 Service 를 사용할 때 서로 다른 객체를 사용 하게 된다.

- 위 상황에서는 A 와 B 가 같은 객체를 사용 하도록 해 주는 것이 더 명확한 프로젝트가 된다.


Bean

- 등록된 class 들을 spring 이 실행 될 때 spring container 에 미리 넣을 수 있게 설정 하는 것이라 보면 된다.

- 이때 class 는 기본적으로 하나만 등록 되며 이에 따라 여러 곳에서 해당 class 를 불러다 사용해도 모두 같은 객체를 사용 할 수 있다.

 

- Bean 의 등록 방법에는 크게 2가지가 있다.

 . Component Scan 을 이용한 자동 의존관계 설정

 . 자바 코드로 직접 Spring Bean 등록


Component Scan 을 이용한 방법

- Spring 에는 "@Controller, @Repository, @Service" 라는 Annotation 이 존재 한다.

- 이들은 각각 controller, repository, service class 바로 위에 달리며 해당 Annotation 이 달리게 되면 spring 이 자동으로 해당 class 를 Bean 에 등록 하게 된다.

- 이후 사용 할 때 "@AutoWired" 를 사용하면 된다.

 

- 예시를 통해 방법을 알아 보면

 . Repository 구현체

  - Repository 위에 "@Repository" 를 붙여 Scan 을 통해 자동으로 등록 되도록 해 준다.

package com.example.springlearn.repository;

import java.util.*;
import com.example.springlearn.domain.Member;
import org.springframework.stereotype.Repository;

@Repository
public class MemoryMemberRepository implements MemberRepository {
	//...
}

 

 . Service class

  - 위와 동일 하게 "@Service" 를 위에 붙여 준다.

  - Sevice 는 Repository 를 사용하기 때문에 이를 연결 해 주어야 한다.

  - 이럴 때 사용 하는 것이 "@Autowired" 이다.

  - 사용 하게 되면 spring container 에 있는 객체를 가져와서 자동을 연결 해 준다.

package com.example.springlearn.service;

import com.example.springlearn.domain.Member;
import com.example.springlearn.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    //...
}

 

 . Controller

  - 이렇게 하면 일단 Service 를 사용하기 위한 준비는 끝이 났다

  - 동일하게 @Autowired 를 사용 하여 자동으로 연결을 해 준다.

package com.example.springlearn.controller;

import com.example.springlearn.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
}

자바 코드로 직접 Spring Bean 등록

- 자동으로 Bean 등록 하지 않고 수동으로 등록 하는 방법도 있다. @Bean 이라고 붙이기만 하면 된다.

- 예시를 통해 방법을 알아 보겠다.

 

- 우선 SpringConfig 파일을 생성 한다.

- 그 후 아래 코드처럼 Bean 에 등록 해야 할 MemeberService, MemberRepository 를 넣어 준다.

- 이 때 memberService 는 생성자가 memberRepository를 받게 만들어 두었었기 때문에 아래 처럼 Repository 를 넣어 주면 된다.

package com.example.springlearn;

import com.example.springlearn.repository.MemberRepository;
import com.example.springlearn.repository.MemoryMemberRepository;
import com.example.springlearn.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
}

마무리

- Spring 이 실행 될 때 DI(Dependency Ingection) 하는 방법은 3가지 정도로 볼 수 있다.

 . 생성자 주입 방식 : class 의 생성자에 파라미터로 넘겨 주입

 . 필드 주입 방식 : 필드에서 바로 주입 하는 방식

 . setter 주입 방식 : setter 를 통해 세팅 하는 방식

- 필드는 위험하고, setter 는 public 으로 해야 하니 중간에 꼬이면 바뀔 위험이 있다.

- 따라서 요즘은 생성자 방식으로 한다고 한다.(아래 처럼 생성자가 외부 객체를 받아 필드의 변수에 넣어 주는 방법)

public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
}