๋กœ์ผ“๐Ÿพ
article thumbnail
๋ฐ˜์‘ํ˜•

์ž๋™์ฐจ์—์„œ ๋งŒ์•ฝ ์—”์ง„์ด ์˜ค๋ž˜๋˜์„œ ์—”์ง„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ž๋™์ž ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์—”์ง„๋งŒ ๋ฝ‘์•„์„œ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์— ๋” ์ˆ˜์›”ํ•˜๊ฒŒ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ์ผ€ ๋„์™€์ค„์ˆ˜ ์žˆ๋„๋ก ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ DI(Dependency Injection)์™€ IoC(Inversion of Control)์ž…๋‹ˆ๋‹ค.

 

 

์ž๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ง์ ‘ ํด๋ž˜์Šค์— new ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DI๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฝ”๋”ฉ์„ ํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด๋ฅผ ์ƒ์„ฑ์‹œ์ผœ ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ฝ”๋“œ์—์„œ ์ง์ ‘์ ์ธ ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ๊ฐ ํด๋ž˜์Šค๋“ค์˜ ๋ณ€๊ฒฝ์ด ์ž์œ ๋กœ์›Œ ์ง‘๋‹ˆ๋‹ค. ์ด๋ฅผ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ ํด๋ž˜์Šค๋“ค๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’๊ฒŒ๋˜๋ฉด ๋‚˜์ค‘์— ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณต์žกํ•ด์งˆ์‹œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ ํด๋ž˜์Šค๋“ค๊ฐ„ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ํด๋ž˜์Šค ์ž์ฒด ๋‚ด์—์„œ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์Šคํ”„๋ง ์ž์ฒด์—์„œ ์„ค์ •์„ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์คŒ์œผ๋กœ์จ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์ค๋‹ˆ๋‹ค.

 

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

 

public class BoardServiceImpl implements BoardService{
	BoardDAO boardDAO;
	public BoardService() {
		boardDAO = new BoardOracleDAOImpl(); //=> ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ์ƒ์„ฑ
	}
}

 

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๊ทธ๋‚˜๋งˆ ํด๋ž˜์Šค๋“ค ๊ฐ„ ์˜์กด ๊ด€๊ณ„๊ฐ€ ์•ฝํ•ด์ง€์ง€๋งŒ, ๋งŒ์•ฝ ์˜ค๋ผํด์ด ์•„๋‹Œ Mysql ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด๋Ÿด ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ๊ณ„์† ํด๋ž˜์Šค ์ž์ฒด์—์„œ new ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

 

public class BoardServiceImpl implements BoardService{
	BoardDAO boardDAO;
	public BoardService() {
		//boardDAO = new BoardOracleDAOImpl(); //=> ํด๋ž˜์Šค์—์„œ ์ง์ ‘ ์ƒ์„ฑ
        boardDAO = new BoardMySqlDAOImpl();
	}
}

 


l DI๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ด์œ 

 

DI๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค๋“ค ๊ฐ„ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ๊ธฐ์กด์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ์„ ์ œ์–ดํ–ˆ๋Š”๋ฐ DI๋กœ ์ธํ•ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ ๋“ฑ ํด๋ž˜์Šค๊ฐ„ ์˜์กด๊ด€๊ณ„๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ์–ดํ•ด์ค€๋‹ค.

DI๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ์†Œ๋ฉธ, ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ XML์ด๋‚˜ ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์คฌ๋˜ ๋ฐ˜๋ฉด์— ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ๊ฐ์ฒด์˜ ์ œ์–ด๋ฅผ ์Šคํ”„๋ง์ด ์ง์ ‘ ๋‹ด๋‹นํ•ด์ฃผ๋Š” IoC ํŠน์ง•์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์ด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ค๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ๋Š” ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DI๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ Bean(์ดํ•˜ ๋นˆ)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ ์ด๋Š” ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” xml ํŒŒ์ผ์—์„œ ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ <bean> ํƒœ๊ทธ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง์—์„œ ์˜์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • setter๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•
  • ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

์ด 2๊ฐ€์ง€์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

<bean> ํƒœ๊ทธ์˜ ์†์„ฑ๋“ค

์†์„ฑ ์ด๋ฆ„ ์„ค๋ช…
id ๋นˆ ๊ฐ์ฒด์˜ ๊ณ ์œ ์ด๋ฆ„์œผ๋กœ, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นˆ์— ์ ‘๊ทผํ•˜๋ฉฐ ์ค‘๋ณต๋˜์„œ ์•ˆ๋œ๋‹ค.
name ๋นˆ ๊ฐ์ฒด์˜ ๋ณ„์นญ
class ์ƒ์„ฑํ•  ํด๋ž˜์Šค ์ด๋ฆ„ (๋นˆ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ํด๋ž˜์Šค์˜ ์ด๋ฆ„ )
constructor-arg ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
property setter๋ฅผ ์ด์šฉํ•ด ๊ฐ’์„ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

l setter๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
	<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
	<!-- id๋Š” ๋นˆ์˜ ๊ณ ์œ ์ด๋ฆ„, class๋Š” ๊ฐ์ฒด ์ฃผ์ž…ํ•  ํด๋ž˜์Šค ์ด๋ฆ„ -->
		<property name="name">
			<value>ํ™๊ธธ๋™</value>
		</property>
		<property name="blood">
			<value>Aํ˜•</value>
		</property>
	</bean>
</beans>

 

new๋ฅผ ์ด์šฉํ•ด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋˜ ๊ฒƒ์„ person.xml์— ์„ค์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

package com.spring.ex01;

public interface PersonService {
	public void sayHello();
}
package com.spring.ex01;

public class PersonServiceImpl implements PersonService{
	private String name;
	private int age;
	private String blood;
	
	/*
	 * xml <value> ํƒœ๊ทธ์˜ ๊ฐ’์„ setter ์ด์šฉํ•ด ์„ค์ •
	 * setter ์•ˆํ•ด์ฃผ๋ฉด ์—๋Ÿฌ๋œธ
	 * ๋งŒ์•ฝ ์—ฌ๊ธฐ ํด๋ž˜์Šค์— blood์— ๊ด€ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์—†์–ด๋„
	 * ๋นˆ์ฆˆ์—์„œ property๋กœ blood๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด
	 * ๊ทธ์— ๋Œ€ํ•œ setter๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผํ•จ
	 * setter ๋ง๊ณ  ์ƒ์„ฑ์ž๋กœ๋„ ์„ค์ • ๊ฐ€๋Šฅ
	 * */
	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * setter์˜ ์ธ์ž๋กœ ๋นˆ์—์„œ ์ƒ์„ฑํ•œ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ
	 * ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— DI๋ผ๊ณ  ํ• ์ˆ˜ ์žˆ๋‹ค.
	 * @param blood
	 */
	public void setBlood(String blood) {
		this.blood = blood;
	}
	
	@Override
	public void sayHello() {
		System.out.println(this.name);
		System.out.println(this.blood);
		System.out.println(this.age);
	}
}

 

PersonServiceImpl์—์„œ ์ธํ„ฐํŽ˜์ด์Šค PersonService๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  setter๋ฅผ ์ด์šฉํ•ด person.xml์—์„œ <value> ํƒœ๊ทธ๋กœ ์„ค์ •ํ•œ ๊ฐ’์„ name ์†์„ฑ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

 

package com.spring.ex01;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class PersonTest {
	public static void main(String[] args) {
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
		// person.xml ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€ BeanFactory ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์‹œ์ผœ์ค๋‹ˆ๋‹ค. ์ฆ‰ ๋นˆ์„ ์ƒ์„ฑ์‹œํ‚ด
		PersonService person = (PersonService) factory.getBean("personService");
		//person.xml์—์„œ์˜ ๋นˆ ๊ฐ์ฒด์˜ id๋ฅผ ๊ฐ€์ ธ์™€์ค๋‹ˆ๋‹ค. id๋Š” ๊ณ ์œ ์ด๋ฆ„์ด๋ฏ€๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
		
		
		//PersonService person = new PersonServiceImpl(); 
		// ๋”์ด์ƒ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
		
		person.sayHello();
	}
}

 

์‹คํ–‰ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์Šคํ”„๋ง์˜ XmlBeanFactory ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด person.xml์˜ ์„ค์ •๋Œ€๋กœ PersonServiceImpl ๋นˆ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ


ใ…ฃ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
	<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
	<!-- id๋Š” ๋นˆ์˜ ๊ณ ์œ ์ด๋ฆ„, class๋Š” ๊ฐ์ฒด ์ฃผ์ž…ํ•  ํด๋ž˜์Šค ์ด๋ฆ„ -->
		<constructor-arg value="์ด์ˆœ์‹ "></constructor-arg>
	</bean>
	
	<bean id="personService2" class="com.spring.ex02.PersonServiceImpl">
		<constructor-arg value="์†ํฅ๋ฏผ"></constructor-arg>
		<constructor-arg value="28"></constructor-arg>
	</bean>
</beans>

 

xml์—์„œ property ๋Œ€์‹  constructor-arg๋ฅผ ์ด์šฉํ•˜์—ฌ value ๋ฅผ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

package com.spring.ex02;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

import com.spring.ex01.PersonService;

public class PersonTest2 {
	public static void main(String[] args) {
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person2.xml"));
		// person.xml ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์™€ BeanFactory ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์‹œ์ผœ์ค๋‹ˆ๋‹ค.
		PersonService2 person1 = (PersonService2) factory.getBean("personService1");
		//person.xml์—์„œ์˜ ๋นˆ ๊ฐ์ฒด์˜ id๋ฅผ ๊ฐ€์ ธ์™€์ค๋‹ˆ๋‹ค. id๋Š” ๊ณ ์œ ์ด๋ฆ„์ด๋ฏ€๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
		
		PersonService2 person2 = (PersonService2) factory.getBean("personService2");
		
		//  PersonService person = new PersonServiceImpl(); ๋”์ด์ƒ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ
		// ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
		
		person1.sayHello();
		person2.sayHello();
	}
}

 

setter์™€ ๋˜‘๊ฐ™์ด ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ


l ์š”์•ฝ

 

  • DI๋Š” ํด๋ž˜์Šค๋“ค๊ฐ„ ์˜์กด๊ด€๊ณ„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง์—์„œ๋Š” ์˜์กด ๊ด€๊ณ„๋ฅผ ์Šคํ”„๋ง ์ž์ฒด์—์„œ ๊ด€๋ฆฌ ํ•ด์ฃผ๋Š” ๋ฐ ์ด๋Ÿฌํ•œ ํŠน์ง•์„ IoC๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
  • ์†Œ์Šค ์ฝ”๋“œ ์ž์ฒด์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์‹œ์ผœ์ฃผ์ง€ ์•Š๊ณ  Bean์„ ์ด์šฉํ•˜์—ฌ ์˜์กด ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ํด๋ž˜์Šค๋“ค๊ฐ„ ์˜์กด๊ด€๊ณ„๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

 

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

 

"๋‚œ ๋ฐ˜๋“œ์‹œ ๋ฐฑ์—”๋“œ ์™•์ด ๋ ๊ฑฐ์•ผ"

๋ฐ˜์‘ํ˜•
profile on loading

Loading...