๋ฒ ์ด์ง๋ฐ
์คํ๋ง ์ปจํ ์ด๋, ์ปดํฌ๋ํธ ์ค์บ, ์คํ๋ง ๋น
์ค์ ํค์๋โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ - ๋ฉด์ ์ ๋์ค๋ ๋ด์ฉ๋ค
- ์คํ๋ง ์ปจํ ์ด๋
- ์์กด์ฑ ์ฃผ์
- ์ ์ด์ ์ญ์
- ์ปดํฌ๋ํธ ์ค์บ
- ์คํ๋ง ๋น
- ๋น์ ์์ ์ฃผ๊ธฐ
- ๋น ์ค์ฝํ
- ์ฑ๊ธํค
์คํ๋ง ์์ฒญ ํ๋ฆ๋
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping()
public String sayHello() {
return "hello";
}
}
- ์๋ ์์
์ ๋๊ฐ ํ์๊น?!
- ์ ๋ถ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํด์ค๋ค!!
HelloController helloController = new HelloController();
helloController.sayHello();
์คํ๋ง ์ปจํ ์ด๋
์คํ๋ง ์ปจํ
์ด๋๋ฅผ ํตํด์ IoC๋ฅผ ๊ตฌํํ๊ณ ์๋ค.
๊ฐ์ฒด๋ค์ ๊ต์ฅํ ๋ง์ด ๋ง๋ค์ด๋์ ๋ค์์ ์ฌ์ฉํ ๊ฐ์ฒด๋ค์ ๋ฏธ๋ฆฌ ๋งํนํด๋์ผ๋ฉด play ๋ฒํผ์ ๋๋ฅด๋ ์๊ฐ ๋งํน๋ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋กํ๋ค.
์ ์ด์ ์ญ์
ํ๋ก๊ทธ๋จ ์คํ ํ๋ฆ์ ์ ์ด๊ถ์ ์ธ๋ถ๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค!
์ ํ๋ฆฌ์ผ์ด์
์์ ์ ํ์ํ ๊ฐ์ฒด๋ฅผ ๋น์ผ๋ก ์ปจํ
์ด๋์ ๋ฑ๋กํ๊ณ ์๋ฒ๋ก ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํด๋น ์์ฒญ ์ฒ๋ฆฌ์ ํ์ํ ๋น์ ํ์ฉํด์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฑ๋ก๋ ๋น ํ์ธํด๋ณด๊ธฐ
@RestController
@RequestMapping("/hello")
public class HelloController {
// ์์ฑ
private final ApplicationContext applicationContext;
// ์์ฑ์ ์ฃผ์
public HelloController(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
// ๊ธฐ๋ฅ
@GetMapping()
public String sayHello() {
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanName : beanDefinitionNames) {
System.out.println(beanName.toString());
}
return "hello";
}
}
์คํ๋ง ์ปจํ ์ด๋์ ์ญํ
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํ์ํ ๋น ์์ฑ
- ๋น์ ํ์ํ ์์กด์ฑ ์ฃผ์
- ๋น์ ์์ ์ฃผ๊ธฐ ๊ด๋ฆฌ
์ปดํฌ๋ํธ ์ค์บ
ํด๋์ค๋ฅผ ๋น์ผ๋ก ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๋ ๊ธฐ์ ์ด๋ค.
import org.springframework.boot.autoconfigure.SpringBootApplication;
๊ธฐ๋ฅ | Annotation | ์ค๋ช |
์๋์ค์ | @EnableAutoConfiguration | ์คํ๋ง ๋ถํธ์ ํ์ฌ๋ ๊ธฐ๋ณธ ์ค์ |
์ปดํฌ๋ํธ ์ค์บ | @ComponentScan | ํ์ฌ ์์น์์๋ถํฐ ํ์ ํจํค์ง์ ๋ชจ๋ @Component ๋์์ ๋น์ผ๋ก ๋ฑ๋ก |
์ถ๊ฐ ์ค์ | @Configuration | ์ปค์คํ ํ๊ฒ ๋ง๋ ์ค์ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉ |
์ง์ ๋น(Bean) ๋ฑ๋กํด๋ณด๊ธฐ
@Component
public class HelloService {
// ์์ฑ
// ์์ฑ์
// ๊ธฐ๋ฅ
public void printHello() {
System.out.println("printing hello");
}
}
@Service
public class HelloService {
// ์์ฑ
// ์์ฑ์
// ๊ธฐ๋ฅ
public void printHello() {
System.out.println("printing hello");
}
}
์์กด์ฑ ์ฃผ์ (DI: Dependency Injection)
โญ๏ธ๋ฉด์ ์์ ๋ฌผ์ด๋ณด๋ ์ง๋ฌธ ๋ด์ฉ๋คโญ๏ธ
- ์์ฑ์ ์ฃผ์ ์์
@Component
public class Car {
private final Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
...
}
}
- ์ธํฐ ์ฃผ์ ์์
@Component
public class Car {
private Engine engine;
@Autowired // ์ธํฐ ์ฃผ์
public void setEngine(Engine engine) {
this.engine = engine;
}
public void start() {
...
}
}
- ํ๋ ์ฃผ์ ์์
@Component
public class Car {
private Engine engine;
@Autowired // ์ธํฐ ์ฃผ์
public void setEngine(Engine engine) {
this.engine = engine;
}
public void start() {
...
}
}
์ข ๋ฅ | ์์ฑ์ ์ฃผ์ | ์ธํฐ ์ฃผ์ | ํ๋ ์ฃผ์ |
์ฅ์ | ์ ํ๋ฆฌ์ผ์ด์
์คํ๊ณผ ๋์์ ์์กด์ฑ์ ์ฃผ์
== ์์ ํ ์์คํ ์์ ์ฑ |
||
๋จ์ | ์์กด์ฑ์ด ๋ง์์ง ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ด ์ ํ.... | 1. ํด๋์ค ์์ ์์กด์ฑ์ด ์จ๊ฒจ์ ธ ์์ด์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค. 2. ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. |
1. ํด๋์ค ์์ ์์กด์ฑ์ด ์จ๊ฒจ์ ธ ์์ด์ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค. 2. ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. |
์์กด์ฑ ์ฃผ์ ์ง์ ์ค์ ํด๋ณด๊ธฐ
@RestController
@RequestMapping("/hello")
public class HelloController {
// ์์ฑ
private final ApplicationContext applicationContext;
private final HelloService helloService;
// ์์ฑ์ ์ฃผ์
public HelloController(ApplicationContext applicationContext, HelloService helloService) {
this.applicationContext = applicationContext;
this.helloService = helloService;
}
// ๊ธฐ๋ฅ
@GetMapping()
public String sayHello() {
helloService.printHello();
return "hello";
}
}
์คํ๋ง ๋น
์คํ๋ง ์ปจํ ์ด๋์ ์ํด์ ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ด๋ค.
๋น์ ์์ ์ฃผ๊ธฐ(Bean LifeCycle)
- ์ด๊ธฐํ๋จ๊ณ
- ๋น์ด ์ค์ ์ฌ์ฉ๋๊ธฐ ์ ํ์ํ ์ถ๊ฐ ์์ ์ ํ๋ ๋จ๊ณ์ด๋ค.
- Ex) ๋น์ ์ํ ์ ๋ฐ์ดํธ, ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ๋ฑ
์ข ๋ฅ | ์ด๊ธฐํ ๋จ๊ณ | ์๋ฉธ ์ง์ |
์ธํฐํ์ด์ค | InitializingBean | DisposableBean |
๋ฉ์๋ | initMethod | destroyMethod |
์ด๋ ธํ ์ด์ | @PostConstruct | @PreDestory |
- ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ
@Component
public class PostConstructExample {
@PostConstruct // ์ด๊ธฐํ ๋จ๊ณ์์ ์ด๋ ํ ์กฐ์์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํด๋ณผ ์ ์๋ค.
public void init() {
System.out.println("@PostConstruct: ์ด๊ธฐํ ์์
์คํ");
}
}
@Component
public class PreDestroyExample {
@PreDestroy // ์๋ฉธ๋๊ธฐ ์ ์ ์ธ์ ๋ฃ๋ ๊ธฐ๋ฅ.
public void cleanup() {
System.out.println("@PreDestroy: ์๋ฉธ ์์
์คํ");
}
}
๋น ์ค์ฝํ(Bean Scope)
- ๋น์ ์์กด ๋ฒ์, ๊ธฐ๋ณธ๊ฐ : ์ฑ๊ธํค
- ์ฑ๊ธํค
- ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ๋จ ํ๋์ ๊ฐ์ฒด๋ง ๋ง๋ค์ด์ง๊ณ ๋ชจ๋๊ฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
public class Singleton {
// ์์ฑ
private static Singleton instance;
// ์์ฑ์: private ์ผ๋ก ์ธ๋ถ์์ ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ
private Singleton() {}
// ๊ธฐ๋ฅ: ์ธ์คํด์ค๋ฅผ ๋ฐํ
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Main {
public static void main(String[] args) {
// ๋ ๋ฒ ํธ์ถํด๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ฐํ
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
// ๊ฐ์ฒด๊ฐ ๊ฐ์์ง ํ์ธ
System.out.println(singleton1 == singleton2); // true
}
๋ค์ํ ์ข ๋ฅ์ ์ค์ฝํ
์ค์ฝํ | ์ค๋ช | ์์กด๋ฒ์ |
singleton | ์คํ๋ง ์ปจํ ์ด๋์ ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ | ์คํ๋ง ์ปจํ ์ด๋์ ํจ๊ป |
prototype | ์์ฒญ๋ง๋ค ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑ | ์ปจํ ์ด๋๊ฐ ์๋ฉธ ๊ด๋ฆฌํ์ง ์์ |
request | HTTP ์์ฒญ๋ง๋ค ์ธ์คํด์ค ์์ฑ | HTTP ์์ฒญ ์ข ๋ฃ ์๊น์ง |
session | HTTP ์ธ์ ๋ง๋ค ์ธ์คํด์ค ์์ฑ | ์ธ์ ์ข ๋ฃ ์ |
application | ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ํ๋์ ์ธ์คํด์ค ๊ณต์ | ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ํจ๊ป |
websocket | ์น ์์ผ ์ธ์ ๋ฒ์์์ ๋์ | ์น์์ผ ์ฐ๊ฒฐ ์ข ๋ฃ๊น์ง |
๊ทธ๋ ๋ค๋ฉด ์ ์ฑ๊ธํค์ผ๊น...?!
์์ฒญ๋ง๋ค ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํด์ผ ํ๋ค๋ฉด?!
๋น์ฉ์ด ๋ง์ด ๋ค๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ฆฌ ํ๋ ์์ฑํด๋๊ณ ๊ทธ๊ฒ๋ง ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฒ์ด๋ค.
'Today I Learned(TIL) > ์์ค๋ณ ํ์ต๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 3ํ์ฐจ ์ธ์ (0) | 2024.12.16 |
---|---|
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 2ํ์ฐจ ์ธ์ (0) | 2024.12.11 |
์์ค๋ณ ํ์ต๋ฐ_์คํ ๋ค๋๋ฐ 1ํ์ฐจ (1) | 2024.12.04 |