JustDoEat

์Šคํ”„๋ง๋นˆ์˜ ์ง๋ฌด์œ ๊ธฐ๋ฅผ ๋ง‰์•„๋ผ, ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐ€์ง€ ์ด์ƒ ์กด์žฌ ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

์Šคํ”„๋ง๋นˆ์˜ ์ง๋ฌด์œ ๊ธฐ๋ฅผ ๋ง‰์•„๋ผ, ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด 2๊ฐ€์ง€ ์ด์ƒ ์กด์žฌ

kingmusung 2024. 2. 24. 00:20

๐Ÿ ์Šคํ”„๋ง๋นˆ์˜ ์ง๋ฌด์œ ๊ธฐ

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ์„๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด DB๋ฅผ ๋‘๊ฐœ ์ด์ƒ์„ ์“ด๋‹ค๋˜์ง€, ํ• ์ธ ์ •์ฑ…์ด ๋‘๊ฐ€์ง€(๊ณ ์ •๊ธˆ์•ก ํ• ์ธ, ๋น„์œจ%ํ• ์ธ) ๋ผ๋˜์ง€..

 

์ฆ‰ ๋‘๊ฐ€์ง€ ์ด์ƒ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์„๋•Œ ๋‘๊ฐ€์ง€ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ชจ๋‘ ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก์ด ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ?

 

์ปดํฌ๋„ŒํŠธ ์Šค์บ”๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์„๋•Œ ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ์ผ์–ด๋‚œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด.

 

์Šคํ”„๋ง์€ ์ƒ์„ฑ์ž ์ฃผ์ž…๊ฐ„์— ํ•ด๋‹น ์ƒ์„ฑ์ž์˜ ํƒ€์ž…๋ช…์„ ๋ณด๊ณ  ํƒ€์ž…๋ช…๊ณผ ๋งค์นญ์ด ๋˜๋Š” ๋นˆ์„ ์ฃผ์ž…์„ ์‹œ์ผœ์ค€๋‹ค.

@Autowired
public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
}

 

userRepository์— UserRepository์˜ ํƒ€์ž…์„ ๊ฐ€์ง€๋Š” ๋นˆ์„(์˜ˆ๋ฅผ ๋“ค๋ฉด JdbcUserRepository, JPAUserRepository ๋ผ๋˜๊ฐ€) ์ฃผ์ž…์„ ํ•ด์ค„๊ฒƒ์ด๋‹ค.

"๊ทผ๋ฐ ์–ด๋ผ? UserRepository JPAUserRepository, UserRepository JdbcUserRepository ๋‘๊ฐœ๋‚˜ ์žˆ๋„ค?? ๋‚˜ ์ผ ์•ˆํ•ด ๋•Œ๋ ค์ณ"

 

์œ„ ์ฒ˜๋Ÿผ ์Šคํ”„๋ง๋นˆ์ด ๋…ธ๋™์กฐํ•ฉ์„ ๊พธ๋ ค ํŒŒ์—…ํ•˜๋Š” ์‚ฌํƒœ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋‹ค. ์Šคํ”„๋ง๋นˆ์˜ ํŒŒ์—…์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์•Œ์•„๋ณด์ž.


 

๊ฐ„๋žตํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด ๊ตฌํ˜„์ฒด ๋‘๊ฐœ์— ๋ชจ๋‘ @Component๋ฅผ ๋ถ™ํ˜€์คŒ์œผ๋กœ์จ ๋‘๊ฐœ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ชจ๋‘ UserRepository ํƒ€์ž…์œผ๋กœ ์Šคํ”„๋ง๋นˆ์— ๋“ฑ๋ก์ด ๋ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€์ฒ˜ํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜์ž

public interface UserRepository {
    void save(User user);
}

//--------------------- ์ธํ„ฐํŽ˜์ด์Šค -----------------------------

@Component
@Primary
public class JdbcUserRepository implements UserRepository {
    // JdbcUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

@Componet
public class JPAUserRepository implements UserRepository{
    // JPAUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

//--------------------- ๊ตฌํ˜„์ฒด -----------------------------

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository JdbcUserRepository) {
        this.userRepository = JdbcUserRepository;
    }
}

 

@Autowired
    public UserService(UserRepository JdbcUserRepository) {
        this.userRepository = JdbcUserRepository;
    }

๋‘๊ฐ€์ง€ ์ด์ƒ์˜ ๋นˆ์ด ์žˆ์„ ์‹œ ๋ช…์‹œ๋ฅผ ํ•ด์„œ ์ ์–ด์ฃผ๋ฉด ์Šคํ”„๋ง๋นˆ์ด ์ธ์‹์„ ํ•˜๊ณ  ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.


@Primary

์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ตฌํ˜„์ฒด์— @Primary๋ฅผ ๋ถ™ํ˜€๋ผ.

 

public interface UserRepository {
    void save(User user);
}

//--------------------- ์ธํ„ฐํŽ˜์ด์Šค -----------------------------

@Component
@Primary
public class JdbcUserRepository implements UserRepository {
    // JdbcUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

@Componet
public class JPAUserRepository implements UserRepository{
    // JPAUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

//--------------------- ๊ตฌํ˜„์ฒด -----------------------------

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

์‹ค๋ˆˆ๋œจ๊ณ  ์—ด์‹ฌํžˆ ๋ณด๋ฉด JdbcUserRepository ์œ„์— @Primary ๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ๋Š”๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋™์ผํ•œ ํƒ€์ž…์˜ ๋นˆ์ด ๋‘๊ฐœ ์ด์ƒ ๋“ฑ๋ก๋˜๋”๋ผ๋„ @Primary ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


@Qualifier

 

public interface UserRepository {
    void save(User user);
}

//--------------------- ์ธํ„ฐํŽ˜์ด์Šค -----------------------------

@Component
@Qualifier("Main")
public class JdbcUserRepository implements UserRepository {
    // JdbcUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

@Componet
public class JPAUserRepository implements UserRepository{
    // JPAUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

//--------------------- ๊ตฌํ˜„์ฒด -----------------------------

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(@Qualifier("Main") UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

 

๋‘๋ˆˆ ํฌ๊ฒŒ ๋œจ๊ณ  ์ž˜ ๋ณด๋ฉด, JdbcUserRepository์— @Qualifier("Main")์ด๋ผ๊ณ  ๋ถ™์€ ๋ถ€๋ถ„์ด ๋ณด์ผ ๊ฒƒ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ 

 

์ƒ์„ฑ์ž ๋ถ€๋ถ„์—๋„ @Qualifier("Main")์ด๋ผ๊ณ  ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์—ˆ๋‹ค.

 

์ฆ‰ @Qualifier("๋งค์นญ ํ•  ์ด๋ฆ„, ์ƒ์„ฑ์ž ๋ถ€๋ถ„์ด๋ž‘ ๊ตฌํ˜„์ฒด๋ž‘ ๊ฐ™์•„์•ผํ•จ") 

 


 

@Qualifier ์•ˆ์— ๋งค์นญ ํ•  ์ด๋ฆ„์ด ๋ฌธ์ž์—ด ์ด๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฌธ์ž์—ด์€ ๊ฒ€์ฆ์„ ๋ชปํ•ด์ฃผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ์˜คํƒ€๋ฅผ ๋‚ด์–ด๋„ ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ฐพ๊ธฐ๊ฐ€ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กญ๋‹ค.

 

๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋…ธํ…Œ์ด์…˜์„ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

package hello.core.annotation;


import org.springframework.beans.factory.annotation.Qualifier;

import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
public @interface Main {



}

// cmd + O ๋ˆ„๋ฅด๋ฉด ๋‚ด๊ฐ€ ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜, ์–ด๋…ธํ…Œ์ด์…˜ ๋ณธ์ง„์œผ๋กœ ์ฒ˜๋“ค์–ด ๊ฐˆ ์ˆ˜ ์žˆ์Œ.

 

์œ„์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์œ„์ฒ˜๋Ÿผ ์ ์–ด์ค€๋‹ค. @์ธํ„ฐํŽ˜์ด์Šค์ž„

 

public interface UserRepository {
    void save(User user);
}

//--------------------- ์ธํ„ฐํŽ˜์ด์Šค -----------------------------

@Component
@Main
public class JdbcUserRepository implements UserRepository {
    // JdbcUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

@Componet
public class JPAUserRepository implements UserRepository{
    // JPAUserRepository์˜ ๊ตฌํ˜„ ๋‚ด์šฉ
}

//--------------------- ๊ตฌํ˜„์ฒด -----------------------------

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(@Main UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}