<์ถœ์ฒ˜ ์ธํ”„๋Ÿฐ>

 

๊ณผ์—ฐ ์Šคํ”„๋ง์€ ์–ด๋–ค ์ด์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„๊นŒ? ์‹ค์ œ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•˜๊ฒŒ ๋˜๋ฉด ๊ณ ๊ฐ์˜ ๋™์‹œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๋งค๋ฒˆ ๊ณ ๊ฐ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์˜ค๊ณ  ๋น„ํšจ์œจ์ ์œผ๋กœ ์šด์˜ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์Šคํ”„๋ง์€ ์ด๋Ÿฐ ๊ฒฝ์šฐ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์œ ์ง€์‹œ์ผœ์ฃผ๋ฉฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ํšจ์œจ์ ์ด๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด ๋ฌด์—‡์ด๋ฉฐ ์Šคํ”„๋ง์ด ์–ด๋–ค ์‹์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

 

 

๐Ÿงธ 




๐Ÿงธ ๊ตฌ์กฐํŒŒ์•… ๐Ÿงธ

    •  singleton
      ใ„ด class : SingletonService, SingletonTest, StatefulService, StatefulServiceTest, ConfigurationSingletonTest 
    • AppConfig

 


 

Q.  ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”?

A. ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

โœ”๏ธ  SingletonTest

 

โ–บ pureContainer

์ˆœ์ˆ˜ ์ž๋ฐ”์ฝ”๋“œ๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•œ๋‹ค.

 

AppConfig appConfig = new AppConfig();

MemberService memberService1 = appConfig.memberService();
MemberService memberService2 = appConfig.memberService();
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ AppConfig์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. appConfig์— ์žˆ๋Š” memberService ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š”๋ฐ ํƒ€์ž…์€ MemberService์ด๋ฉฐ ๊ฐ ์ด๋ฆ„์€ memberService1๊ณผ memberService2๊ฐ€ ๋œ๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์ง€๋„, ์Šคํ”„๋ง์„ ์ด์šฉํ•˜์ง€๋„ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— memberService1๊ณผ memberService2๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค. ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋‹ค์ˆ˜ ๊ณ ๊ฐ์˜ ๋™์‹œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ณ ๊ฐ์ด ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค AppConfig๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ์ด ๋งŽ์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

 

 

โ–ธ  ๊ฒฐ๊ณผ

๊ฐ ๊ฐ’์ด 6a472554์™€ 7ff2a664๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

••• ์ด์–ด์„œ ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ถ€๋ถ„ •••

 

 

Assertions.assertThat(memberService1).isNotSameAs(memberService2);

 

assertThat(A).isNotSameAs(B)

: ๋Œ€์ƒ A์™€ ๋Œ€์ƒ B์˜ ์ฃผ์†Œ๊ฐ’์ด ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฉ”์„œ๋“œ

 

Q. assertThat(A).isEqualTo(B)์™€ assertThat(A).isSameAs(B)์™€ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€?
A. isEqualTo๋Š” ๋Œ€์ƒ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ  isSameAs๋Š” ๋Œ€์ƒ์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

์˜ˆ์‹œ) isEqualTo
String A = "Hi";
String B = "Hi";

assertThat(A).isEqualTo(B);โ€‹



์˜ˆ์‹œ) isSameAs (==)

String A = "Hi";
String B = A;

assertThat(A).isSameAs(B);

 

 

 

 


 

 

 

โœ”๏ธ SingletonService

์‹ฑ๊ธ€ํ†ค ๋””์ž์ธ ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

private static final SingletonService instance = new SingletonService();

 

private

: ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ํ•œ๋‹ค.

 

static

:  instance ๋ณ€์ˆ˜๊ฐ€ ํด๋ž˜์Šค ์ˆ˜์ค€์—์„œ ๊ด€๋ฆฌ๋˜๊ฒŒ ํ•˜๋ฉฐ, ํด๋ž˜์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋œ๋‹ค.

 

final

: ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

 

Q. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์— static์€ ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ? 

A.  static์€ ์ธ์Šคํ„ด์Šค(๋ฉ”๋ชจ๋ฆฌ ์œ„์— ์˜ฌ๋ผ๊ฐ„ ๊ฐ์ฒด)๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๋‹จ์ˆœํžˆ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ธ์Šคํ„ฐ์Šค๋ฅผ ์ƒ์„ฑ ํ›„ ๊ณต์œ ํ•ด ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ static์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๋ฉฐ, ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ (์‚ฌ์šฉ)ํ•˜๋„๋ก ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. private์™€ final์˜ ์—ญํ• ์€ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋„๋ก ํ•ด์ค€๋‹ค.

 

 

 

- ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด๊ณผ static์˜ ๊ด€๋ จ ์ถœ์ฒ˜

 

์‹ฑ๊ธ€ํ„ด ํŒจํ„ด( Singleton Pattern ) ๊ณผ static - Java ๋””์ž์ธ ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€? ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด static์€ ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์•„ ๋ณด์ด๊ณ  ๊ฐ์ฒด ์ง€ํ–ฅ์ด ์•„๋‹ˆ๋ผ๋Š” ์ฃผ์žฅ์— ์ด๋Ÿฌํ•œ ๋น„ํŒ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋‚˜์™”๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ, ์–ด๋–ค

100100e.tistory.com

 

 

Q. ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค์˜ ์ฐจ์ด

A. ๊ฐ์ฒด๋Š” ์„ ์–ธ, ์ธ์Šคํ„ด์Šค๋Š” ์‹ค์ฒดํ™”๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ, ์ธ์Šคํ„ด์Šค๋Š” ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์œ„์— ์˜ฌ๋ ค์กŒ์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํŠน๋ณ„ํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ํ•œ๋‹ค. (์šฉ์–ด์˜ ์˜๋ฏธ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅผ ๋ฟ, ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ™๋‹ค๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.)

Dog myDog = new Dog(); 
Dog anotherDog = new Dog();


์œ„์˜ ๋‘ ์ฝ”๋“œ์—์„œ myDog์™€ anotherDog๋Š” Dog ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ด์ž ์ธ์Šคํ„ด์Šค์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ๊ฐ์ฒด์ง€๋งŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ํ•œ๋‹ค.

 

 

- ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค์˜ ์ฐจ์ด์  ์ถœ์ฒ˜

 

instance๋ž€?

์ธ์Šคํ„ด์Šค๋ž€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object Oriented Programming)์—์„œ class์— ์†Œ์†๋œ ๊ฐœ๋ณ„์ ์ธ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, user๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  hong์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, hong์ด๋ผ๋Š” ๊ฐ์ฒด๋Š” user

velog.io

 

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

 

public static SingletonService getInstance() {
        return instance;
    }
SingletonService์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , getInstance( ) ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ ‘๊ทผํ•œ๋‹ค. 
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ static์œผ๋กœ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ getInstance( )์ธ ๋“ฏ ํ•˜๋‹ค.

 

 

  private SingletonService() {

    }

 

์ƒ์„ฑ์ž

: ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”์„œ๋“œ

 

 

Q. ์ƒ์„ฑ์ž๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ๋ฌด์—‡์ธ๊ฐ€?

A. ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)๋กœ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ๋ฌด์กฐ๊ฑด ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์•ผํ•˜๋ฉฐ, ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋๋Š”๋ฐ ๊ทธ์— ๋งž๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

	public Book() {	}                          // ๊ธฐ๋ณธ์ƒ์„ฑ์ž
	
	public Book(String title, int price) {    // ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž
		this.title = title;
		this.price = price;
	}

 

		Book b1 = new Book();                // ๊ฐ์ฒด์ƒ์„ฑ - ๊ธฐ๋ณธ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋จ
		Book b2 = new Book("๊ตญ์–ด์ฑ…", 3000);   // ๊ฐ์ฒด์ƒ์„ฑ - ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ƒ์„ฑ์ž ํ˜ธ์ถœ๋จ

 

 

 

- ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์„ค๋ช… ์ถœ์ฒ˜

 

[Java] ์ž๋ฐ” - ์ƒ์„ฑ์ž์˜ ๋ชฉ์ , ํŠน์ง•, ์‚ฌ์šฉ๋ฒ• (Constructor)

์ž๋ฐ” - ์ƒ์„ฑ์ž์˜ ๋ชฉ์ , ํŠน์ง•, ์‚ฌ์šฉ๋ฒ• 1. ์ƒ์„ฑ์ž์˜ ๋ชฉ์  ์ƒ์„ฑ์ž(Constructor)๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ฉค๋ฒ„ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)๋กœ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 2. ์ƒ์„ฑ์ž์˜ ํŠน

kadosholy.tistory.com

 

 

Q. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์˜ ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ธ๊ฐ€? ์™œ ์“ฐ๋Š”๊ฑธ๊นŒ?

A. ์œ„์˜ ์ƒ์„ฑ์ž๋Š” ๊ธฐ๋ณธ์ƒ์„ฑ์ž์™€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ผ๋‹จ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” public์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š”๋ฐ, ์œ„์˜ ์ฝ”๋“œ๋Š” private๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•œ ๋ช…์‹œ์  ์ƒ์„ฑ์ž(๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š”)๋‹ค.  private๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

 

••• ์—ฐ๊ฒฐ๋œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ™•์ธํ•˜๊ธฐ •••

 

 

โœ”๏ธ  SingletonTest

 

โ–บ singletonServiceTest

SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();
SingletonService์˜ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ธ์Šคํ„ด์Šค๋ฅผ ์™ธ๋ถ€์—์„œ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก private ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  static, final, private๋กœ ์ธ์Šคํ„ด์Šค ๋ณ€๊ฒฝ์„ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ „์—ญ์ ์œผ๋กœ ๊ณต์œ ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด getInstance ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

getInstance( )๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜์—ฌ singletonService1๊ณผ singletonService2์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์œ ์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

โ–บ singleton ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘ ์‚ดํŽด๋ณด๊ธฐ

# SingletonService
private static final SingletonService instance = new SingletonService();
# SingletonTest
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();

 

ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋˜๋ฉด instance ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์ ์žฌ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ instance ์‹ค์ œ ๊ฐ’์ด ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, instance๋ผ๊ณ  ์ด๋ฆ„๋งŒ ๋ถ™์—ฌ์ง„ ๊ป๋ฐ๊ธฐ๋งŒ ๋ฉ”์„œ๋“œ ์˜์—ญ์— ์žˆ์œผ๋ฉฐ ์‹ค์ œ ๊ฐ์ฒด๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋˜์–ด์žˆ๋‹ค. ๋ฉ”์„œ๋“œ ์˜์—ญ์—๋Š” ํž™ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๊ฐ์ฒด๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ๊ฐ’ ์œ„์น˜๊ฐ€ ์กด์žฌํ•œ๋‹ค.

singletonService1์€ ์Šคํƒ ์˜์—ญ์— ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด singletonService1์€ ๋ฉ”์„œ๋“œ ์˜์—ญ์˜ instance๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํž™์˜ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๊ทธ ํ›„ singletonService2๊ฐ€ ์ƒ์„ฑ๋˜์–ด๋„ singletonService1์™€ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์˜์—ญ์ด ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” instance ํž™์˜ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ƒ์„ฑํ•ด๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ static์„ ๋ถ™์ด์ง€ ์•Š๊ฒŒ ๋˜๋ฉด instance๋Š” ๋ฉ”์„œ๋“œ์— ์ ์žฌ๋˜์ง€ ์•Š๊ณ  ํž™์— ์ ์žฌ๋œ๋‹ค. ์ด๋•Œ ์Šคํƒ์—๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ํž™ ์˜์—ญ์— ์žˆ๋Š” instance๋Š” ๊ณ„์†ํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— new SingletonService( )๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ instance์˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

โ–บ ๊ฒฐ๋ก 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด DIP,OCP๋ฅผ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”๊ตฌ๋‚˜ private ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์œ ์—ฐ์„ฑ๋„ ๋–จ์–ด์ง„๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 


 

 

 

 

โœ”๏ธ SingletonTest

 

โ–บ springContainer

// ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฝ”๋“œ ์ •์˜
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

MemberService memberService1 = ac.getBean("memberService", MemberService.class);
MemberService memberService2 = ac.getBean("memberService", MemberService.class);
AppConfig์— ์ •์˜๋˜์–ด์žˆ๋Š” memberService๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋นˆ์„ MemberService ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์„ฑ์— ์˜ํ•ด ๊ฐ™์€ ๋นˆ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

 

 

๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

โœ”๏ธ  StatefulService

๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์€ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

 

 

โ–บ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ 

# StatefulService
private int price; 

public void order(String name, int price) { 
	...
	this.price = price; 
}
# StatefulServiceTest

statefulService1.order("userA", 20000);
statefulService2.order("userB", 10000);

int price = statefulService1.getPrice();
System.out.println("price = " + price);

 

์ฒ˜์Œ์— order์— 20000์ด ๋“ค์–ด์™”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด this๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ๊ฐ’์€ ํ•„๋“œ์— ์žˆ๋Š” price๋กœ ๋“ค์–ด๊ฐ€๋ฉด์„œ ๊ฐ’์ด ๊ณต์œ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ userB๊ฐ€ 10000์„ ์ฃผ๋ฌธํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์‹œ ํ•„๋“œ๋Š” 10000์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ฐ’์ด ์ฆ‰๊ฐ์ ์œผ๋กœ ๋Œ๋ ค์ง€๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ์ด๋ ‡๊ฒŒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ price์˜ ๊ฐ’์€ 10000์ด ๋˜๊ณ  ๊ทธ ํ›„์— statefulService1์˜ price๋ฅผ ์ถœ๋ ฅํ•˜๋‹ˆ ๋งˆ์ง€๋ง‰ ์ƒํƒœ์˜€๋˜ 10000์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

 

 

โ–บ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„ํ•˜๊ธฐ

public int order(String name, int price) {
        ...
        return price;
    }
order ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ€๊ฒฉ์„ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ , ๊ฐ ์š”์ฒญ์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

 


 

 

 

 

โœ”๏ธ  StatefulServiceTest

 

โ–บ TestConfig

 	@Bean
        public StatefulService statefulService() {
            return new StatefulService();
        }
@Bean์„ ์จ์„œ ๊ฐ„๋‹จํ•œ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

	StatefulService statefulService1 = ac.getBean(StatefulService.class);
        StatefulService statefulService2 = ac.getBean(StatefulService.class);
statefulService1๊ณผ statefulService2์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์š”๊ตฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด TestConfig์— ์žˆ๋Š” StatefulService๋กœ ๊ฐ€์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

•••๊ทธ ๋‹ค์Œ ์ฝ”๋“œ •••

 

	int userAprice = statefulService1.order("A", 2000);
        int userBprice = statefulService2.order("B", 1000);
StatefulService์˜ order ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ๋‚ด๋ถ€์ƒํƒœํ•„๋“œ price์— ๊ฐ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

 

์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค

 

 

 

 


 

 

 

โœ”๏ธ  ์ž๋ฐ” ์ฝ”๋“œ์˜ ์‹ฑ๊ธ€ํ†ค ์œ ์ง€๋ฒ•

 

โ–บ AppConfig

    @Bean
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }
    
    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), rateDiscountPolicy());
    }
์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด memberService์—์„œ memberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  memberRepository์— ์žˆ๋Š” MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. memberRepository์—์„œ MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. orderService์—์„œ memberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  memberRepositorysms MemoryMemberRepository๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์ด 3๋ฒˆ์˜ MemoryMemberRepository๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉด์„œ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ ธ๋ณด์ธ๋‹ค. ๊ณผ์—ฐ ์ง„์งœ๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ง€๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

 

 

โ–บ MemberServiceImpl

    public MemberRepository getMemberRepository() {
    	return memberRepository;
    }
memberRepository๊ฐ€ private final๋กœ ์ •์˜๋˜์–ด์žˆ๊ธฐ์— ์™ธ๋ถ€ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ memberRepository๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ดgetMemberRepository๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ memberRepository๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ MemoryMemberRepository์— ์ƒ์†๋˜์–ด์žˆ๋‹ค.

 

 

 

โ–บ ConfigurationSingletonTest

        MemberRepository memberRepository1 = memberService.getMemberRepository();
        MemberRepository memberRepository2 = orderService.getMemberRepository();

        System.out.println("memberService -> memberRepository1 = " + memberRepository1);
        System.out.println("orderService -> memberRepository2 = " + memberRepository2);
        System.out.println("memberRepository = " + memberRepository);
memberService์™€ orderService๋Š” getMemberRepository๋ฅผ ํ†ตํ•ด memberRepository์˜ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ถœ๋ ฅ ๊ฒฐ๊ณผ memberRepository๋Š” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 

 

โ–บ ์ด์œ ์— ๋Œ€ํ•˜์—ฌ

@Configuration
public class AppConfig {
@Configuration์ด ๋ถ™๊ฒŒ๋˜๋ฉด AppConfig๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์ด CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ AppConfig์— AppConfig@CGLIB๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋˜์–ด์„œ ์‹ค์ œ ์‹คํ–‰์€ AppConfig@CGLIB๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ @Configuration์„ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด @Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

๐ŸŒท

 

์ด๋ ‡๊ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€, ์Šคํ”„๋ง์ด ์‹ฑ๊ธ€ํ†ค์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ณด์žฅํ•ด๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด์ ์œผ๋กœ ๋นˆ์„ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์•Œ๊ฒŒ๋˜์—ˆ์ง€๋งŒ,

@Configuration์„ ํ†ตํ•ด ์ž๋ฐ” ์ฝ”๋“œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

+ Recent posts