2021. 10. 8. 08:00ใBack-End ์์ ์ค/Spring Framework
๐ ๋ชฉ์ฐจ
01. [Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ
02. [Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
03. [Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
04. [Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ
05. [Spring] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์๋ก์ด ํ ์ธ ์ ์ฑ
๊ฐ๋ฐ
06. [Spring] AppConfig ๋ฆฌํฉํฐ๋ง
07. [Spring] Ioc, DI Container
08. [Spring] ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
09. [Spring] ์ฑ๊ธํค ์ปจํ
์ด๋
10. [Spring] Component Scan And Auto wired Start
11. [Spring] ์์กด๊ด๊ณ ์ฃผ์
๋ฐฉ๋ฒ
12. [Spring] Bean Life Cycle Call Back
13. [Spring] Bean Scope
๐ ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ
DB ์ปค๋ฅ์ ํ์ด๋, ๋คํธ์ํฌ ์์ผ์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ ํ์ํ ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ํด๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์์ ์ ์ฐ๊ฒฐ์ ๋ชจ๋ ์ข ๋ฃํ๋ ์์ ์ ์งํํ๋ ค๋ฉด ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์ข ๋ฃ ์์ ์ด ํ์ํ ๊ฒ์ด์์.
๊ฐ๋จํ๊ฒ ์ธ๋ถ ๋คํธ์ํฌ์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋ ๋ค๊ณ ํ ๋, ์ค์ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์๋๊ณ , ๋จ์ํ ๋ฌธ์๋ง ์ถ๋ ฅํ๋๋ก ํ๋ฒ ํด ๋ณผ ๊ฒ์ด์์.
์ด NetworkClient๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ์ connect()๋ฅผ ๋ถ๋ฌ๋ด์ด ์ฐ๊ฒฐ์ ๋งบ์ด๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋ฉด disCounnect() ๋ถ๋ฌ๋ด์ด ์ฐ๊ฒฐ์ ๋์ด์ผ ํ๋ ๊ฒ์ด์์.
package hello.core.lifecycle;
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
public void setUrl(String url) {
this.url = url;
}
//์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//์๋น์ค ์ข
๋ฃ์ ํธ์ถ
public void disconnect() {
System.out.println("close: " + url);
}
}
์คํ๋ง ํ๊ฒฝ์ค์ ๊ณผ ์คํ
์์ ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ์ด์ํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ด์์.
์์ฑ์ ํธ์ถ, url = null
connect: nullcall: null message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
call: null message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
์์ฑ์ ๋ถ๋ถ์ ๋ณด๋ฉด URL ์ ๋ณด ์์ด connect๊ฐ ๋ถ๋ฌ์ง ๊ฒ์ ๋ณผ ์ ์๋ ๊ฒ์ด์์.
๋๋๋๋ ๋น์ฐํ์ง๋ง, ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋จ๊ณ์๋ URL์ด ์๊ณ , ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค์ ์ธ๋ถ์์ Setter ์ฃผ์ ์ ํตํด setUrl()์ด ๋ถ๋ฌ์ ธ์ผ URL์ด ์๊ธฐ๊ฒ ๋๋ ๊ฒ์ด์์.
์คํ๋ง ๋น์ ๊ฐ๋จํ๊ฒ ์๋์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋ ๊ฒ์ด์์.
๊ฐ์ฒด ์์ฑ => ์์กด๊ด๊ณ ์ฃผ์
์คํ๋ง ๋น์ ๊ฐ์ฒด๋ฅผ ์์ฑ, ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๋ค ๋๋ ๋ค์์์ผ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ค๋น๊ฐ ์๋ฃ ๋๋ ๊ฒ์ด์์. ๋ฐ๋ผ์ ์ด๊ธฐํ ์์ ์ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๋ชจ๋ ์๋ฃ๋๊ณ ๋ ๋ค์์ผ ํธ์ถ๋๋ ๊ฒ์ด์์. ๊ทธ๋ฐ๋ฐ, ๊ฐ๋ฐ์๊ฐ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ๋ชจ๋ ์๋ฃ๋ ์์ ์ ์ด๋ป๊ฒ ์ ์ ์์๊น์?
์คํ๋ง ์์กด ๊ด๊ณ ์ฃผ์ ์ด ์๋ฃ๋๋ฉด ์คํ๋ง ๋น์๊ฒ ์ฝ๋ฐฑ ๋ฉ์๋๋ฅผ ํตํด์ ์ด๊ธฐํ ์์ ์ ์๋ ค์ฃผ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด์์. ๋ํ, ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์๋ฉธ ์ฝ๋ฐฑ์ ์ค๋ต๋๋ค. ๋ฐ๋ผ์ ์์ ํ๊ฒ ์ข ๋ฃ ์์ ์ ์งํํ ์ ์๋ ๊ฒ์ด์์.
๐ ์คํ๋ง ๋น์ ์ด๋ฒคํธ ์๋ช ์ฃผ๊ธฐ
์คํ๋ง ์ปจํ ์ด๋ ์์ฑ => ์คํ๋ง ๋น ์์ฑ => ์์กด ๊ด๊ณ ์ฃผ์ => ์ด๊ธฐํ ์ฝ๋ฐฑ => ์ฌ์ฉ => ์๋ฉธ์ ์ฝ๋ฐฑ => ์คํ๋ง ์ข ๋ฃ
- ์ด๊ธฐํ ์ฝ๋ฐฑ : ๋น์ด ์์ฑ๋๊ณ , ๋น์ ์์กด ๊ด๊ณ ์ฃผ์ ์๋ฃ ๋ค ํธ์ถ
- ์๋ฉธ์ ์ฝ๋ฐฑ : ๋น์ด ์๋ฉธ๋๊ธฐ ์ง์ ํธ์ถ
์คํ๋ง์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์ง์ํ๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
๊ฐ์ฒด์ ์์ฑ๊ณผ ์ด๊ธฐํ ๋ถ๋ฆฌ
์์ฑ์๋ ํ์ ์ ๋ณด(๋งค๊ฐ ๋ณ์)๋ฅผ ๋ฐ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฑ ์์ ๊ฐ๋๋ค.
๋ฐ๋ฉด์ ์ด๊ธฐํ๋ ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ๋ค์ ํ์ฉ ์ธ๋ถ ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ๋ ๋ฑ ๋ฌด๊ฑฐ์ด ๊ณผ์ ์ ํ๋ค.
๋ฐ๋ผ์ ์์ฑ์ ์์์ ๋ฌด๊ฑฐ์ด ์ด๊ธฐํ ์์ ์ ํจ๊ป ํ๋ ๊ฒ ๋ณด๋ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ถ๋ถ๊ณผ ์ด๊ธฐํ ํ๋ ๋ถ๋ถ์ ๋ช ํํ๊ฒ ๋๋๋ ๊ฒ์ด ์ ์ง๋ณด์ ๊ด์ ์์ ์ข๋ค.
๋ฌผ๋ก ์ด๊ธฐํ ์์ ์ด ๋ด๋ถ ๊ฐ๋ค๋ง ์ฝ๊ฐ ๋ณ๊ฒฝํ๋ ์ ๋๋ก ๋จ์ํ ๊ฒฝ์ฐ ์์ฑ์์์ ํ๋ฒ์ ๋ค ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ ์๋ ์๋ค.
์ฑ๊ธํค ๋น๋ค์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋ ๋, ์ฑ๊ธํค ๋น๋ค๋ ํจ๊ป ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์๋ฉธ์ ์ฝ๋ฐฑ์ด ๋ฐ์. ์ฑ๊ธํค์ฒ๋ผ ์ปจํ ์ด๋์ ์์๊ณผ ์ข ๋ฃ๊น์ง ์์ข ํ๋ ๋น๋ ์์ผ๋, ์๋ช ์ฃผ๊ธฐ๊ฐ ์งฆ์ ๋น๋ค๋ ์๋๋ฐ, ์ด ๋น๋ค์ ์ปจํ ์ด๋์ ๋ฌด๊ดํ๊ฒ ํด๋น ๋น์ด ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ์๋ฉธ์ ์ฝ๋ฐฑ์ด ์ผ์ด๋๋ค.
์คํ๋ง์ ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ์ ์ง์ํ๋ ๊ฒ์ด์์.
- ์ธํฐํ์ด์ค(InitalizingBean, DisposableBean)
- ์ค์ ์ ๋ณด์ ์ด๊ธฐํ ๋ฉ์๋, ์ข ๋ฃ ๋ฉ์๋ ์ง์
- @PostConstruct, @PreDestroy ์ง์
๐ ์ธํฐํ์ด์ค InitializingBean, DisposableBean
package hello.core.lifecycle;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
} //์๋น์ค ์ข
๋ฃ์ ํธ์ถ
public void disConnect() {
System.out.println("close + " + url);
}
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
@Override
public void destroy() throws Exception {
disConnect();
}
}
InitializingBean์ afterPropertiesSet()์ ํตํด ์ด๊ธฐํ๋ฅผ ์ง์ํ๋ ๊ฒ์ด์์.
DisponsableBean์ destroy()๋ฅผ ํตํด ์๋ฉธ์ ์ง์ํ๋ต๋๋ค.
๐ป ์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
NetworkClient.afterPropertiesSet
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
13:24:49.043 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.destroy
close + http://hello-spring.dev
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ด๊ธฐํ ๋ฉ์๋๊ฐ ์ฃผ์ ์๋ฃ ๋ค ์ ์ ํ๊ฒ ๋ถ๋ ค์ง ๊ฒ์ ํ์ธํ ์ ์๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ์คํ๋ง ์ปจํ ์ด๋์ ์ข ๊ต๊ฐ ํธ์ถ๋์ ๋ง์ ์๋ฉธ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๊ฒ๋ ๋ณด์ด๋ค์!
๐ ์ด๊ธฐํ, ์๋ฉธ ์ธํฐํ์ด์ค ๋จ์
์ด ์ธํฐํ์ด์ค๋ ์คํ๋ง ์ ์ฉ ์ธํฐํ์ด์ค๋ก ํด๋น ์ฝ๋๊ฐ ์คํ๋ง ์ ์ฉ ์ธํฐํ์ด์ค์ ์์กดํ๋ ๊ฒ์ด์์.
์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋์ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์๊ณ , ๋ด๊ฐ ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํ ์ ์๋ค๋ ํ๊ณ๊ฐ ์๋ ๊ฒ์ด์์.
๐ก ์ฐธ๊ณ :
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ด๊ธฐํ, ์ข ๋ฃ ๋ฐฉ๋ฒ์ ์คํ๋ง ์ด์ฐฝ๊ธฐ์ ๋์จ ๋ฐฉ๋ฒ์ด๋ฉฐ, ์ง๊ธ์ ๋ ๋์ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌ
๐ ๋น ๋ฑ๋ก ์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋ ์ง์
์ค์ ์ ๋ณด์ @Bean(initMethod = "init", destroyMethod = "close") ์ฒ๋ผ ์ด๊ธฐํ, ์๋ฉธ ๋ฉ์๋ ์ง์ ์ด ๊ฐ๋ฅํ ๊ฒ์ด์์.
package hello.core.lifecycle;
public class NetworkClient {
private String url;
public NetworkClient() {
System.out.println("์์ฑ์ ํธ์ถ, url = " + url);
}
public void setUrl(String url) {
this.url = url;
}
//์๋น์ค ์์์ ํธ์ถ
public void connect() {
System.out.println("connect: " + url);
}
public void call(String message) {
System.out.println("call: " + url + " message = " + message);
}
//์๋น์ค ์ข
๋ฃ์ ํธ์ถ
public void disConnect() {
System.out.println("close + " + url);
}
public void init() {
System.out.println("NetworkClient.init");
connect();
call("์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง");
}
public void close() {
System.out.println("NetworkClient.close");
disConnect();
}
}
์ค์ ์ ๋ณด์ ์ด๊ธฐํ ์๋ฉธ ๋ฉ์๋ ์ง์
@Configuration static class LifeCycleConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
networkClient.setUrl("http://hello-spring.dev");
return networkClient;
}
}
๐ป ์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = nullNetworkClient.init
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
13:33:10.029 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.close
close + http://hello-spring.dev
์ค์ ์ ๋ณด ์ฌ์ฉ์ ์๋์ ๊ฐ์ ํน์ง์ด ์๋ ๊ฒ์ด์์.
- ๋ฉ์๋ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ค ์ ์๋ค.
- ์คํ๋ง ๋น์ด ์คํ๋ง ์ฝ๋์ ์์กดํ์ง ์๋๋ค.
- ์ฝ๋๊ฐ ์๋๋ผ ์ค์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ด๊ธฐํ, ์ข ๋ฃ ๋ฉ์๋๋ฅผ ์ ์ฉํ ์ ์๋ค.
์ข ๋ฃ ๋ฉ์๋ ์ถ๋ก
- @Bean์ destroyMethod ์์ฑ์ ํน๋ณํ ๊ธฐ๋ฅ ์กด์ฌ
- Library๋ ๋๋ถ๋ถ close, shutdown ์ด๋ผ๋ ์ด๋ฆ์ ์ข ๋ฃ ๋ฉ์๋ ์ฌ์ฉ
- @Bean์ destroyMethod๋ ๊ธฐ๋ณธ๊ฐ์ด (inferred - ์ถ๋ก )์ผ๋ก ๋ฑ๋ก
- ์ด ์ถ๋ก ๊ธฐ๋ฅ์ close, shutdown ์ด๋ผ๋ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ๋ฉฐ, ์ด๋ฆ ๊ทธ๋๋ก ์ข ๋ฃ ๋ฉ์๋๋ฅผ ์ถ๋ก ํด์ ๋ถ๋ฌ์ค๋ค.
- ์์ ๊ฐ์ ์ด์ ๋ก ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ฉด ์ข ๋ฃ ๋ฉ์๋๋ ๋ฐ๋ก ๊ธฐ์ฌํ์ง ์์๋ ๋๋ค.
- ์ถ๋ก ๊ธฐ๋ฅ์ Disable ํ๋ ค๋ฉด destroyMethod="" ์ฒ๋ผ ๋น ๊ณต๋ฐฑ ์ง์
๐ @PostConstruct, @PreDestroy
๐ป ์ถ๋ ฅ ๊ฒฐ๊ณผ
์์ฑ์ ํธ์ถ, url = null
NetworkClient.init
connect: http://hello-spring.dev
call: http://hello-spring.dev message = ์ด๊ธฐํ ์ฐ๊ฒฐ ๋ฉ์์ง
19:40:50.269 [main] DEBUG
org.springframework.context.annotation.AnnotationConfigApplicationContext -
Closing NetworkClient.close
close + http://hello-spring.dev
@PostConstruct, @PreDestroy ์ด๊ฒ๋ง ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ํธ๋ฆฌํ๊ฒ ์ด๊ธฐํ์ ์ข ๋ฃ๋ฅผ ํ ์ ์๋ ๊ฒ์ด์์.
@PostConstruct, @PreDestroy ํน์ง
์ต์ ์คํ๋ง์์ ๊ฐ์ฅ ๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ์ด๋ ธํ ์ด์ ํ๋๋ง ๋ถ์ด๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊น๋ํ๊ณ , ๊ฐํธํ ๊ฒ์ด์์.
ํจํค์ง๋ฅผ ์ ๋ณด๋ฉด javax.annotation.PostConstruct์ธ๋ฐ, ์คํ๋ง์ ์ข ์์ด ์๋ JSR-250์ด๋ผ๋ JAVA Standard์ธ ๊ฒ์ด์์. ๋๋ฌธ์ ์คํ๋ง์ด ์๋ ๋ค๋ฅธ ์ปจํ ์ด๋์์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์์.
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์ ์ด์ธ๋ฆฌ๋ ์น๊ตฌ์ด์ง๋ง, ์ ์ผํ ๋จ์ ์ผ๋ก ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฉํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด์์. ๋๋ฌธ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๊ธฐํ, ์ข ๋ฃ ์์๋ @Bean์ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ด์์.
์ ๋ฆฌํ์๋ฉด
@PostConstruct, @PreDestroy๋ฅผ ์ฌ์ฉํฉ์๋ค!
์ฝ๋๋ฅผ ๊ณ ์น ์ ์๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๊ธฐํ, ์ข ๋ฃํด์ผ ํ๋ค๋ฉด @Bean์ initMethod, destroyMethod๋ฅผ ์ฌ์ฉํฉ์๋ค!
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช ๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค.
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @Builder (Builder Patter) (0) | 2021.10.11 |
---|---|
[Spring] Bean Scope (0) | 2021.10.10 |
[Spring] ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2021.10.07 |
[Spring] Component Scan And Auto wired Start (0) | 2021.10.06 |
[JPQL] left ( outer ) join (0) | 2021.10.05 |