Home > Backend > Spring > πŸƒ[Spring] μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°.

πŸƒ[Spring] μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°.
Spring Framework

πŸƒ[Spring] μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°.

  • μŠ€ν”„λ§μ—μ„œ μžλ°” μ½”λ“œλ‘œ μŠ€ν”„λ§ λΉˆμ„ 직접 λ“±λ‘ν•˜λŠ” 방법은 주둜 @Configuration μ• λ…Έν…Œμ΄μ…˜κ³Ό @Bean μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 이루어 μ§‘λ‹ˆλ‹€.
    • 이 방식은 XML μ„€μ • 파일 λŒ€μ‹  μžλ°” 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€ν”„λ§ λΉˆμ„ μ •μ˜ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

1️⃣ @Configuration κ³Ό @Bean 을 μ‚¬μš©ν•œ 빈 등둝

  • @Configuration
    • 이 μ• λ…Έν…Œμ΄μ…˜μ€ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ ν•˜λ‚˜ μ΄μƒμ˜ @Bean λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  있으며, μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 빈 μ •μ˜λ₯Ό μƒμ„±ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆλŠ” μ„€μ • ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • @Bean
    • 이 μ• λ…Έν…Œμ΄μ…˜μ€ λ©”μ„œλ“œ λ ˆλ²¨μ—μ„œ μ‚¬μš©λ˜λ©°, λ©”μ„œλ“œμ˜ 리턴값이 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 빈(Bean)이 됨을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

2️⃣ μ˜ˆμ‹œ.

μ•„λž˜λŠ” MemoryMemberRepository 클래슀λ₯Ό μžλ°” μ½”λ“œλ‘œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜λŠ” 방법을 λ³΄μ—¬μ£ΌλŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€.

  • 1. 빈으둜 등둝할 클래슀 μ •μ˜
    ```java
    package com.devkobe.hello_spring.repository;

import com.devkobe.hello_spring.domain.Member;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

public class MemoryMemberRepository implements MemberRepository {

private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;

@Override
public Member save(Member member) {
    member.setId(++sequence);
    store.put(member.getId(), member);
    return member;
}

@Override
public Optional<Member> findById(Long id) {
    return Optional.ofNullable(store.get(id));
}

@Override
public Optional<Member> findByName(String name) {
    return store.values().stream()
            .filter(member -> member.getName().equals(name))
            .findAny();
}

@Override
public List<Member> findAll() {
    return new ArrayList<>(store.values());
}

public void clearStore() {
    store.clear();
} } ```
  • 2. μžλ°” μ„€μ • νŒŒμΌμ—μ„œ 빈 등둝
    ```java
    package com.devkobe.hello_spring.config;

import com.devkobe.hello_spring.repository.MemberRepository;
import com.devkobe.hello_spring.repository.MemoryMemberRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

@Bean
public MemberRepository memberRepository() {
    return new MemoryMemberRepository();
} } ```
  • 3. μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ 빈 μ‚¬μš©
    ```java
    package com.devkobe.hello_spring.service;

import com.devkobe.hello_spring.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberService {

private final MemberRepository memberRepository;

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

// λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 λ©”μ„œλ“œλ“€... } ```

3️⃣ μ„€λͺ….

  • AppConfig 클래슀
    • @Configuration μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 이 ν΄λž˜μŠ€κ°€ μŠ€ν”„λ§ μ„€μ • 클래슀둜 μ‚¬μš©λ  κ²ƒμž„μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
    • memberRepository() λ©”μ„œλ“œλŠ” @Bean μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ •μ˜λ˜μ–΄ 있으며, 이 λ©”μ„œλ“œμ˜ 리턴값이 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 빈이 λ©λ‹ˆλ‹€.
      • 이 경우, MemoryMemberRepository 객체가 빈으둜 λ“±λ‘λ©λ‹ˆλ‹€.
  • 빈 μ‚¬μš©
    • MemberService ν΄λž˜μŠ€μ—μ„œ MemberRepository νƒ€μž…μ˜ 빈이 μƒμ„±μž μ£Όμž… λ°©μ‹μœΌλ‘œ μ£Όμž…λ©λ‹ˆλ‹€.
      • μ΄λ•Œ, AppConfig ν΄λž˜μŠ€μ—μ„œ λ“±λ‘λœ MemoryMemberRepository 빈이 μ£Όμž…λ©λ‹ˆλ‹€.

4️⃣ μ™œ μžλ°” 섀정을 μ‚¬μš©ν• κΉŒ?

  • 1. νƒ€μž… μ•ˆμ •μ„±
    • μžλ°” μ½”λ“œλŠ” 컴파일 μ‹œμ μ— νƒ€μž…μ„ 체크할 수 μžˆμœΌλ―€λ‘œ, XML보닀 νƒ€μž… μ•ˆμ •μ„±μ΄ λ†’μŠ΅λ‹ˆλ‹€.
  • 2. IDE 지원
    • μžλ°” 기반 섀정은 IDE의 μžλ™ μ™„μ„± κΈ°λŠ₯κ³Ό λ¦¬νŒ©ν† λ§ 도ꡬλ₯Ό 잘 지원받을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 3. μ½”λ“œ μž¬μ‚¬μš©μ„±
    • μžλ°” μ„€μ • ν΄λž˜μŠ€λŠ” 일반 μžλ°” μ½”λ“œμ²˜λŸΌ μž¬μ‚¬μš© 사λŠ₯ν•˜λ©°, 상속과 μ‘°ν•© 등을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ κ²°λ‘ 

  • μŠ€ν”„λ§μ—μ„œ μžλ°” μ½”λ“œλ‘œ λΉˆμ„ λ“±λ‘ν•˜λŠ” 방법은 @Configuration κ³Ό @Bean μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œ λ°©λ²•μž…λ‹ˆλ‹€.
    • 이 방식은 XML 기반 섀정보닀 더 νƒ€μž… μ•ˆμ „ν•˜κ³ , μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš°λ©°, ν˜„λŒ€μ μΈ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.