Gallery
Search

๊ฐ๋จํ ์ผํ๋ชฐ ๊ฐ๋ฐ ๊ธฐ๋ฅ๋ชฉ๋ก
โข
ํ์๊ธฐ๋ฅ
โฆ
ํ์๊ฐ์
โฆ
ํ์๋ชฉ๋ก ์กฐํ
โข
์ํ๊ธฐ๋ฅ
โฆ
์ํ๋ฑ๋ก
โฆ
์ํ์์
โฆ
์ํ์กฐํ
โข
์ฃผ๋ฌธ๊ธฐ๋ฅ
โฆ
์ํ์ฃผ๋ฌธ
โฆ
์ฃผ๋ฌธ๋ด์ญ์กฐํ
โฆ
์ฃผ๋ฌธ์ทจ์
โข
๊ธฐํ ์๊ตฌ์ฌํญ
โฆ
์ํ์ ์ฌ๊ณ ๊ด๋ฆฌ๊ฐ ํ์
โฆ
์ํ์ ์ข
๋ฅ๋ ๋์, ์๋ฐ, ์ํ๋ก ๊ตฌ๋ถ
โฆ
์ํ์ ์นดํ
๊ณ ๋ฆฌ๋ก ๊ตฌ๋ถ ํ ์ ์์
โฆ
์ํ ์ฃผ๋ฌธ์ ๋ฐฐ์ก ์ ๋ณด๋ฅผ ์
๋ ฅ ํ ์ ์์
๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ
[Boot+JPA] ์๊ตฌ์ฌํญ ๋ถ์ ๋ฐ ์ค๊ณ

H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์น
H2 ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ก์ปฌํ๊ฒฝ์ ์ค์นํ์ฌ ์ฌ์ฉํ๊ณ ์ ํ๋ค. ๊ณผ๊ฑฐ MacOS ์ค์น ๋ด์ฉ๊ณผ ๋์ผํ๋ฏ๋ก ํด๋น ๋ด์ฉ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค.
์ต์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ JDBC URL์ ๋ค์์ฒ๋ผ ์
๋ ฅํ๋ค.

[Boot+JPA] JPA, DB ์ค์

ํ๋ก์ ํธ ์์ฑ
ํ๋ก์ ํธ๋ JDK 8(1.8) ๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์ ํ์ง๋ง spring.io์์๋ ๋์ด์ ๊ณผ๊ฑฐ ๋ฒ์ ๋ค์ ์
์
์ ์ ๊ณตํ์ง ์๋ ๋ฌธ์ ์ ์ด ์๋ค. ๋ฐ๋ผ์ ์ํ๋ group, artifact ๋ช
์ ์์ฑํ๊ณ ์ฐ์ 17๋ฒ์ ์ผ๋ก ์์ฑํ ์ดํ ํ๋ก์ ํธ ๋ด๋ถ์์ build.gradle์ ํตํด ๋ค์ด ๊ทธ๋ ์ด๋๋ฅผ ํ๊ณ ์ ํ๋ค.
๊ณผ๊ฑฐ ๋ฒ์ ์ ํ๋ก์ ํธ ์
์
์ด ๋ ์ค์ผ๋ ํค ๋ฐฑ์
๋ณธ์ด ์์ด์ ์๋์ฒ๋ผ ์งํํ๊ฒ ๋์๋ค.

๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
ํ๋ก์ ํธ ์์ฑ ๋จ๊ณ์์ ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐ ํ ์ ์๋ค. ์์ฑ ์ดํ์ build.gradle์ ์ง์ ์ถ๊ฐํด๋ ๋์ง๋ง ์ฐ์ ์ ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ Spring Web, JPA, Lombok๊ณผ H2 Database๋ฅผ ์ ํํ์ฌ ์ถ๊ฐํ๋ค.
[Boot+JPA] ํ๋ก์ ํธ ํ๊ฒฝ ์ค์

์น ์ค์ฝํ์ ์ข ๋ฅ
โข
โrequestโ : HTTP ์์ฒญ ํ๋๊ฐ ๋ค์ด ์ค๊ณ ๋๊ฐ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ, ์์ฒญ๋ง๋ค ๋ณ๋ ๋น ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ค.
โข
โsessionโ : HTTP Session๊ณผ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
โข
โapplicationโ : ์๋ธ๋ฆฟ ์ปจํ
์คํธ์ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
โข
โwebsocketโ : ์น ์์ผ๊ณผ ๋์ผํ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ์ค์ฝํ
์ธ์
, ์ดํ๋ฆฌ์ผ์ด์
, ์น์์ผ์ ๋ฒ์๋ง ๋ค๋ฅด์ง๋ง ๋์๋ฐฉ์์ ๋น์ทํ๋ค. ๋ํ์ ์ผ๋ก request ์ค์ฝํ์ ์์๋ฅผ ์ฐธ๊ณ ํ๊ณ ์ ํ๋ค.
[SpringCore] ๋น ์ค์ฝํ - ์น ์ค์ฝํ

๋น ์ค์ฝํ ์ข ๋ฅ
์คํ๋ง์ ๋ค์ํ ๋น ์ค์ฝํ๋ฅผ ์ง์ํ๋ค.
โข
์ฑ๊ธํค : ๊ธฐ๋ณธ ์ค์ฝํ, ์ปจํ
์ด๋ ์์๊ณผ ์ข
๋ฃ๊น์ง ์ ์ง๋๋ ๊ฐ์ฅ ๋์ ๋ฒ์
โข
ํ๋กํ ํ์
: ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ๋กํ ํ์
๋น์ ์์ฑ๊ณผ ์์กด๊ด๊ณ ์ฃผ์
๊น์ง๋ง ๊ด์ฌํ๊ณ ๋๋ ๊ด๋ฆฌํ์ง ์๋ ๋งค์ฐ ์งง์ ๋ฒ์
โข
์น ๊ด๋ จ ์ค์ฝํ :
โฆ
โrequestโ : ์น ์์ฒญ์ด ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
โฆ
โsessionโ : ์น ์ธ์
์ด ์์ฑ๋๊ณ ์ข
๋ฃ๋ ๋ ๊น์ง ์ ์ง๋๋ ์ค์ฝํ
โฆ
โapplicationโ : ์น ์๋ธ๋ฆฟ ์ปจํ
์คํธ์ ๊ฐ์ ๋ฒ์๋ก ์ ์ง๋๋ ์ค์ฝํ
์ฑ๊ธํค ์ค์ฝํ
[SpringCore] ๋น ์ค์ฝํ - ์ฑ๊ธํค๊ณผ ํ๋กํ ํ์

์ธ๋ถ ๋คํธ์ํฌ์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฐ์ฒด๋ฅผ ํ๋ ์์ฑํ๋ค๊ณ ๊ฐ์
๊ฐ๋จํ๊ฒ urlํ๋๊ฐ ์๋ ์ธ๋ถ ์ฐ๊ฒฐ ๋์ NetworkClient์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฐ๊ฒฐํ๋ ํ ์คํธ์ฝ๋ 1
ํด๋น ์ค์ ์ ๋ณด๋ฅผ ๋ณด๋ฉด NetworkClient ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ํ ์์ฑ์ ๋ด๋ถ์์ ์ดํ์ setUrl()๋ฉ์๋๋ฅผ ํตํด url์ ์ ๋ฌํ๊ณ ์๋ค.
[SpringCore] ๋น ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ (์ฌ๋ฐ๋ฅธ ์ด๊ธฐํ, ์ข
๋ฃ ๋ฐฉ๋ฒ)

โํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ์โ
์คํ๋ง์ด ๋์ค๊ณ ์๊ฐ์ด ๊ฐ์๋ก ์๋์ ์ ํธํ๋ ์ถ์ธ์ด๋ค.
โข
์คํ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก @Component ๋ฟ๋ง ์๋๋ผ @Controller, @Service, @Repository ์ฒ๋ผ ๊ณ์ธต์ ๋ง์ถ์ด ์ค์บ์ ์ง์ํ๊ณ ์๋ค.
โข
@Component๋ง ๋ฃ์ด์ฃผ๋ฉด ๋๋ ๊ณผ์ ์ @Configuration ๋ฑ ์ค์ ์ ๋ณด๋ฅผ ์ง์ ํ๊ณ @Bean์ผ๋ก ๋ฑ๋กํ๋ ๋ฑ ๊ณผ์ ์ ๋ฒ๊ฑฐ๋กญ๋ค.
โข
์๋ ๋น ๋ฑ๋ก์ ํตํด์ ๊ธฐ๋ณธ์ ์ผ๋ก OCP, DIP๋ฅผ ์งํฌ ์ ์๋ค.
โ์๋ ๋น ๋ฑ๋ก์ ์ธ์ ์ฌ์ฉํ๋๊ฐ?โ
[SpringCore] ์๋์ฃผ์
, ์๋์ฃผ์
์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ์ค

์ ์ฒด ํ ์คํธ ์ฝ๋
์ฌ๋ฌ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ DiscountPolicy (Map)
์ฐ์ DiscoutService ๋ผ๋ ํด๋์ค์์๋ Map์ผ๋ก fixDiscountPolicy, rateDiscountPolicy ๋ ๊ตฌํ์ฒด๋ฅผ ๋ชจ๋ ์ฃผ์
๋ฐ์๋ค.
์ดํ DiscountPolicy ๊ฐ์ฒด๋ฅผ ํตํด์ ๋ด๋ถ์ discount ๋ฉ์๋์ String(discountCode)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ฌ ๊ทธ ๊ตฌํ์ฒด๋ฅผ ์ ํํ๋๋ก ํ๋ ๋ฐฉ์์ด๋ค.
Map์ผ๋ก ๊ฐ ๊ตฌํ์ฒด๊ฐ ์ ์ฅ๋์ด key, value ์์ผ๋ก ์ ์ฅ๋์ด์๊ธฐ ๋๋ฌธ์ key๊ฐ์ธ String(์ฌ๊ธฐ์ discountCode๋ผ๋ ๋ฌธ์์ด๋ก ํน์ )๋ก ๊ตฌํ์ฒด๋ฅผ ์ ํํ๋ค. ์ด๋ฅผ ํตํด ๋งต์ key๊ฐ์ ์คํ๋ง ๋น ์ด๋ฆ์ด ์ ์ฅ๋๋ ๊ฒ์ ์ ์ ์๊ณ ์ํ๋ ๊ฒ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ ์ ํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
[SpringCore] ์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋(๋์ ์ผ๋ก ์ ํ์ด ํ์ํ ๋)

๊ตฌํ์ฒด๊ฐ 2๊ฐ์ธ ์ํฉ
DiscountPolicy๋ ๊ณ ์ ํ ์ธ์ธ FixDiscountPolicy, ๋น์จ ํ ์ธ์ธ RateDiscountPolicy ์ฒ๋ผ ๊ตฌํ์ฒด๊ฐ 2๊ฐ๊ฐ ์์ผ๋ฉฐ ๊ณํ์ ๋ฐ๋ผ ์ ํํ์ฌ ์ฌ์ฉํ๊ณ ์๋ค.
ํ์ง๋ง ์ด์ฒ๋ผ ๋ ํด๋์ค ๋ชจ๋ @Component๋ฅผ ๋ช
์ํ๊ฒ ๋๋ฉด @ComponentScan์ ์ํด ๋ชจ๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ฉด์ ์ถ์ ํด๋์ค DiscountPolicy๋ฅผ ํธ์ถํ๋ ๋จ๊ณ์์ ์คํ๋ง์ ์ด๋ค ๊ฒ์ ์ ํ ํ ์ง ์ ์ ์๊ฒ ๋๋ค.

[SpringCore] @Qulifier ์ถ๊ฐ ํ์, @Primary ์ฐ์ ๊ถ ์ง์ , ์ ๋ํ
์ด์
์ ์ง์ ๋ง๋ค๊ธฐ

Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฃผ์
build.gradle ์ ๋กฌ๋ณต ์ฌ์ฉ์ ์ํด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ ์ถ๊ฐํด์ค๋ค.
Lombok์ผ๋ก ๋ฆฌํฉํ ๋ง
OrderServiceImpl ๋ถํฐ ์์ ํด๋ณธ๋ค. Lombok์ ํตํด ๋ง์ ์ฝ๋๋์ ์ค์ฌ์ฃผ์ง๋ง ์ค์ ๋ก๋ class ํ์ผ์๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋๋ค.
@RequiredArgsConstructor
[SpringCore] ๋กฌ๋ณต์ ํ์ฉํ ๋ฆฌํฉํ ๋ง

์์กด ๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
โข
์์ฑ์ ์ฃผ์
โข
์์ ์(setter) ์ฃผ์
โข
ํ๋ ์ฃผ์
โข
์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
1. ์์ฑ์ ์ฃผ์
[SpringCore] ์์กด๊ด๊ณ ์๋ ์ฃผ์
๋ฐฉ๋ฒ๋ค๊ณผ ์์ฑ์ ์ฃผ์
์ ๊ถ์ฅํ๋ ์ด์

@ComponentScan ์ ๋ฒ์ ์ง์
basePackages ์์ฑ
ํตํด ์ปดํฌ๋ํธ ์ค์บ์ ๋์ ํจํค์ง๋ฅผ ์ง์ ํ ์ ์๋ค. ๋ช
์๋ ํจํค์ง๋ฅผ ํฌํจํ ํ์ ํจํค์ง๋ค์ ํ์ํ๋ฉด์ ์คํ๋ง ๋น์ ๋ฑ๋ก ํ๊ฒ ๋๋ค.
basePackages = "hello.core", โhello.serviceโ ์ฒ๋ผ ์ฌ๋ฌ ์์ ์์น๋ ์ฌ์ฉ ํ ์ ์๋ค.
basePackageClasses ์์ฑ
[SpringCore] ์ปดํฌ๋ํธ ์ค์บ - ์ค์บ ๋ฒ์ ์ง์ , ๊ธฐ๋ณธ ์ค์บ ๋์

์๋ ์ฃผ์ ์ ์ํ ์ปดํฌ๋ํธ ์ค์บ
์คํ๋ง์ ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ด์ ์ ์์ฑํด์จ AppConfig.java์์๋ @Bean ์ด๋
ธํ
์ด์
์ผ๋ก ์๋์ผ๋ก ์ง์ ์ค์ ์ ๋ณด๋ฅผ ์์ฑํ๊ณ , ์์กด ๊ด๊ณ๋ ๋ช
์ํ์๋ค.
์ด์ ์คํ๋ง์์๋ @ComponentScan โ @Component ๋ฑ๋ก๋ ํด๋์ค ์ฐพ์ ๋น์ผ๋ก ๋ฑ๋กํ๋ค โ ์์กด๊ด๊ณ๋ @Autowired ๋ฅผ ํตํด ์ฃผ์
๋๋ค.
AutoAppConfig.java๋ก ์๋ ์ฃผ์
๊ณผ ๊ด๋ จ๋ ์ค์ ์ ๋ณด๋ฅผ ์๋ก ์์ฑํ๋ค. ์ค์ ๋ก๋ AppConfig์ ์์
ํด๋ ๋์ง๋ง ๋น๊ต๋ฅผ ์ํด ์๋ก ์์ฑํ์๋ค.
[SpringCore] ์ปดํฌ๋ํธ ์ค์บ - ์คํ๋ง ๋น ์๋ โ ์๋ ์ฃผ์
๋ณ๊ฒฝ

AppConfig์ ์ด์ํ ์
๋ถ๋ช
AppConfig ๋ํ ์๋ฐ ์ฝ๋๊ธฐ ๋๋ฌธ์
1.
memberService๊ฐ ํธ์ถ ๋ ๋ memberRepository๋ฅผ new๋ก ์์ฑํ๊ณ
2.
orderService๊ฐ ํธ์ถ ๋ ๋๋ memberRepository๋ฅผ new๋ก ์์ฑํ๋ค
๊ทธ๋ผ ๊ฐ๊ฐ new ์ธ์คํด์ค๋ฅผ ํตํด ๋ค๋ฅธ ์ฃผ์์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
[SpringCore] ์ฑ๊ธํค ํจํด - @Configuration์ ์ฑ๊ธํค ํ
์คํธ

์ฑ๊ธํค ๋ฐฉ์์ ์ฃผ์์
์ฑ๊ธํค ํจํด์ด๋ ์คํ๋ง ์ปจํ
์ด๋ ์ฒ๋ผ ์ฑ๊ธํค ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ ๋๋ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํ๋๋ง ์์ฑํด์ ๊ณต์ ํ๋ ๋ฐฉ์์์๋ ์ํ๋ฅผ ์ ์ง(stateful)ํ๊ฒ ์ค๊ณํ๋ฉด ์๋๋ค.
โ ๋ฌด์ํ(stateless)๋ก ์ค๊ณํด์ผ ํ๋ค.
โข
ํน์ ํด๋ผ์ด์ธํธ์ ์์กด์ ์ธ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
โข
ํน์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋๊ฐ ์์ผ๋ฉด ์๋๋ค.
โข
์ฝ๊ธฐ๋ง ๊ฐ๋ฅํด์ผ ํ๋ค.
[SpringCore] ์ฑ๊ธํค ํจํด - ์ฑ๊ธํค ๋ฐฉ์์ ์ฃผ์์ (stateless ์ค๊ณ ํ์์ฑ)

์คํ๋ง ์๋ ์์ํ ์คํ๋ง ์ปจํ ์ด๋ ๋ชจ์ต

์ AppConfig์ ๋ฐ๋ผ memberService๋ฅผ ํธ์ถ ํ ๋ ๋ง๋ค new๋ก ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ๋ฌธ์ ์ ์ด ์๋ค.
[SpringCore] ์ฑ๊ธํค ํจํด - ์ฑ๊ธํค ํจํด์ ์ฌ์ฉํ๋ ์ด์ ์ ์คํ๋ง ์ปจํ
์ด๋์ ์ฑ๊ธํค ํจํด

์๋ฐ ์ฝ๋ ์ค์ ์ฌ์ฉ ๋ฐฉ์
ํ์ฌ๊น์ง ์ฌ์ฉํ๋ new AnnotationConfigApplicationContext(AppConfig.class); ์ฒ๋ผ ํด๋น ํด๋์ค๋ฅผ ํตํด ์๋ฐ ์ฝ๋๋ก ๋ ์ค์ ์ ๋ณด๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ
XML ์ค์ ์ฌ์ฉ ๋ฐฉ์
์ AppConfig.java๋ฅผ ๋์ ํ์ฌ appConfig.xml ์์ค์ฝ๋๋ฅผ ์ค์ ์ ๋ณด๋ก ์ธ์ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฌธ๋ฒ์ ์์ดํ๋ ๊ฑฐ์ ๋น์ทํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. <bean> ๊ณผ ๊ฐ์ ํ๊ทธ๋ก ๋ณ๊ฒฝ๋๊ณ ์์ฑ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฌธ๋ฒ์ด ์ฌ์ฉ๋๋ค.
[SpringCore] ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น - ์คํ๋ง ์ปจํ
์ด๋์ ์ค์ ํ์ ์ง์ (Java ์ด๋
ธํ
์ด์
/XML)๊ณผ BeanDefinition

BeanFactory
โข
์คํ๋ง ์ปจํ
์ด๋์ ์ต์์ ์ธํฐํ์ด์ค
โข
์คํ๋ง ๋น์ ๊ด๋ฆฌํ๊ณ ์กฐํํ๋ ์ญํ ๋ด๋น
โข
ํ์ฌ๊น์ง ์ฌ์ฉํ getBean(), getBeansOfType() ๋ฑ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค
ApplicationContext

[SpringCore] ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น - BeanFactory์ ApplicationContext

@Bean์ผ๋ก ๋ฑ๋ก๋ ์คํ๋ง ๋น
AppConfig.java๋ฅผ @Configuration ์ด๋
ธํ
์ด์
์ ํตํด ์คํ๋ง ์ค์ ์ ๋ณด๋ก ์ฌ์ฉํ๊ณ ์๋ค.
๋ค์์ฒ๋ผ 4๊ฐ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ํด๋์ค๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ผ๋ฉฐ ํด๋น AppConfig.java๋ํ ํ๋์ ๋น์ผ๋ก ์ธ์๋์ด ๋ก๋๋ ๊ฒ์ ํ์ธํ์๋ค.

[SpringCore] ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น - ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋ ๋น ์กฐํ ํ
์คํธ

์คํ๋ง ์ปจํ ์ด๋์ ์ฌ์ฉ
DI ์ปจํ
์ด๋ ์ญํ ์ ํด์ฃผ๋ AppConfig๋ฅผ Spring ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ๋ฆฌํฉํ ๋งํ๋ค.
๊ธฐ์กด ์ฝ๋ AppConfig.java
Spring Container์ ๋น์ ๋ฑ๋กํ๋ AppConfig.java
[SpringCore] ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น - ๊ธฐ์กด DI ์๋ฐ ์ฝ๋๋ฅผ Spring ์ปจํ
์ด๋ ํ์ฉ ์ฝ๋๋ก ๋ฆฌํฉํ ๋ง

๊ธฐ์กด ์ฝ๋์ ๋ฌธ์
์ฃผ๋ฌธ๊ณผ ํ ์ธ์ ์์ฑํ OrderService, DiscountPolicy ์ฒ๋ผ ์๋น์ค ๊ณ์ธต์ด ์๋ค. ์๋ ์์ฑํ ๊ธฐ์กด ์ฝ๋๋ ๊ฐ ๋ ์ด์ด์์ ์ง์ ์ฃผ์
๋ฐ๋ ๊ฐ์ฒด๋ฅผ ์์ฑ(new)ํ๋ ๋ฌธ์ ๊ฐ ์๋ค.
ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝํ๋ ค๊ณ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ ์์ง๋ง ์๋น์ค ๊ณ์ธต(ํด๋ผ์ด์ธํธ)์์๋ ์ถ์ ํด๋์ค๋ง์ด ์๋ ๊ตฌํ ํด๋์ค(ํ์)์๋ ์์กดํ๊ณ ์๋ค.(= ์ง์ ํด๋น ๊ณ์ธต์์ ์ฝ๋๋ฅผ ์์ ํ๊ณ ์๋ค.) ์ด๋ DIP(์ถ์๋๋๋ถ๋ชจํด๋์ค ์์กด)์ด ์๋ฐ๋๊ณ ์๋ค.
๋ํ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์ ํด๋ผ์ด์ธํธ ์ฝ๋(์๋น์ค ๊ณ์ธต) ์ฝ๋์ ์ํฅ์ ์ค๋ค. ์ด๋ OCP(ํ์ฅ๊ฐ๋ฐฉ ์์ ํ์) ์๋ฐ์ด๋ค.
๋ณ๊ฒฝ๋ ์๋น์ค ์์ค์ฝ๋
[SpringCore] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์ญํ , ๊ตฌํ์ ๋ถ๋ฆฌ๋ฅผ ์ํ AppConfig์ ์ถ๊ฐ, ์ ์ด์ ์ญ์ (IoC), ์์กด๊ด๊ณ ์ฃผ์
(DI)

๋ฉ์๋์ ์๊ฐ์ ์ธก์ ํด๋ณด์
๋ค์์ฒ๋ผ ๋ฉ์๋ ์คํ ์๊ฐ์ ์ธก์ ํ๋ ค๋ฉด ๋จ์ํ ๋ฉ์๋์ ์์๋ถ๋ถ๊ณผ ์ข
๋ฃ๋ถ๋ถ์ ์๊ฐ์ ๊ณ์ฐํ๋ฉด ๋ผ์ง๋ง ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ค๋ณต๋๋ ์ฝ๋๋์ด ๋ง์์ง๋ค. ๋ํ ์๊ฐ ์ธก์ ๋ก์ง์ด ๋ณธ๋ ์๋น์ค ์ฝ๋๋ณด๋ค ํจ์ฌ ๋ง์์์ ์ฐจ์งํ๋ฉด์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
MemberService.java ์ ์๊ฐ ์ธก์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ ์์ ์ผ๋ก ์๋ํ์ง๋ง ์ข์ ์ฝ๋๋ ์๋๋ค.
AOP ์ฌ์ฉํด๋ณด๊ธฐ (Aspect Oriented Programming)
[SpringIntro] AOP ํ์ฉ

JpaRepository ์ธํฐํ์ด์ค
SpringDataJpa๋ ์๋ง์ ๊ธฐ๋ฅ๋ค์ด ํฌํจ๋ JpaRepository ์ธํฐํ์ด์ค๊ฐ ์์ผ๋ฉฐ ๊ฐ๋ฐ์๋ ๋จ์ํ๊ฒ Repository์ JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์์ ๊ธฐ๋ฅ์ ์ด์ฉ ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฉ์๋๋ค์ ๋๋ถ๋ถ ์ค๋ณต ์ ๊ฑฐํ์ฌ ์ฌ์ฉ ํ ์ ์์ด ๊ฐํธํ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋งตํ ํ ์ ์์ด ์์ฐ์ฑ์ด ๋์์ง๋ค.
extends ๋ก ์์๋ JpaRepository ๋ถ๋ถ์ ๋ค์ด๊ฐ๋ณด๋ฉด ํด๋น ์ธํฐํ์ด์ค์์ ์ ๊ณต๋๋ ๋ฉ์๋๋ค์ ํ์ธ ํ ์ ์๋ค.

[SpringIntro] ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ - 3, Spring Data JPA

JPA๋?
JDBC, JDBC Template์ ์ฌ์ฉํ๋ฉด์ ์ค๋ณต ์ฝ๋๋ฅผ ํฌ๊ฒ ์ ๊ฑฐํ์ง๋ง ์ฌ์ ํ ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์์ฑํ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ด๋ IDE์์๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต๊ณ ๊ฐ๋ฐ์์ ์ค์๊ฐ ๋ํ๋ ์ ์๋ ๋จ์ ์ด ์๋ค. JPA๋ฅผ ํตํด ๊ฐ์ฒด ์ค์ฌ ์ค๊ณ๋ก ์ ํ ํ ์ ์๋ค.
โข
Java Persistance API์ ์ฝ์๋ก ORM(Object-Relational-Mapping) ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค์ ๋ชจ์
โฆ
ORM์ด๋?
โฆ
ORM์ ๊ฐ์ฒด์ DB ํ
์ด๋ธ์ด ๋งคํ์ ์ด๋ฃจ๋ ๊ฒ์ ์๋ฏธ
โฆ
'ORM(Object Relational Mapping)'์ '๊ฐ์ฒด๋ก ์ฐ๊ฒฐ์ ํด์ค๋ค'๋ ์๋ฏธ๋ก, ์ดํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ SQL์ธ์ด๊ฐ ์๋ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ธ์ด๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ํด
1. JPA ์ค์
build.gradle ์์ dependencies ๋ถ๋ถ์ JPA ์์กด์ฑ์ ์ถ๊ฐํด์ค๋ค.
[SpringIntro] ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ - 2, JPA

ํ ์คํธ์ฉ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์น ๊ณผ์
H2 DB engine ์ค์น

๊ถํ ์ค์
[SpringIntro] ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ - 1, JDBC์ JDBC Template

๊ต๊ณผ์์ ์ธ, ์ ๋๋ ์ ๋ฐฐ์ ์ฝ๋๋ค์ ๋ฐ๋ผ๊ฐ์
ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๋๊ปด์จ ๊ฒ๋ค์ ๋ด๊ฐ ์์ฑํ๋ ์ฝ๋์ ์ ๋์ํ, ์ด๋ป๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ์ง, ๊ทธ ๊ธฐ์ค์ ์ด๋ป๊ฒ ๋์ด์ผํ๋์ง ํญ์ ๊ณ ๋ฏผ์ด๋ค. ์ด๋ค ์ฝ๋๊ฐ ์ข์ ์ฝ๋์ธ์ง ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ์ธ์ง ๋ง๋์ง ์๋์ง ๋์์์ด ๊ณ ๋ฏผ์ ํ์ง๋ง, ํผ์ ๊ณต๋ถํ๋ ์
์ฅ์์๋ ๋๋ฌด ๋ง์ ์ ๋ณด๋ค์ด ํผ๋์ค๋ฝ๊ฒ ํ๋ค.
์ค์ฒด๋ฅผ ๋ฐ๋ผ ์ฐพ์๋ณด์.
๋จ์ํ ํํธํ๋ ๊ถ๊ธ์ฆ์ ๋ํ ํค์๋ ๊ฒ์์ ๋ํ ๋ง์ ์ ๋ณด๋ค์ ์ข
ํฉํด๋ณด๋ฉด ๋จธ๋ฆฌ์์๋ ์ดํด๊ฐ ๋๋๊ฒ ๊ฐ๋ค. ํด๋ฆฐ ์ฝ๋๋ฅผ ์งํฅํ๋๊ฒ์ ์ฝ๋ ์์ฒด๋ก๋ ์ฃผ์์ด ํ์ ์์ ์ ๋๋ก ๊น๋ํ ์ฝ๋, ๋ช
๋ช
๊ท์น๋ฑ์ ๋ฐ๋ผ์ผ ํ๋ค. ํ์ง๋ง ๊ทธ ๋ฐฉ๋ฒ์ด๋ ์ค๋ฌผ์ ๋ณด์ง ๋ชปํ๊ณ ์ถ์์ ์ผ๋ก ๊ฐ๋
๋ง ์ดํดํ๊ณ ๊ฒฐ๊ตญ ํผ์ ํด๋ณด๋ คํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ์์ฑํ๋ ๊ฒ๋ค์ ๋ํ ์์ ๊ฐ์ด ์๋ค.
๊ฒฐ๊ตญ ์ฐ์ํ ์ ๋ฐฐ๋ฅผ ์ค์ค๋ก ๋ง๋ค๊ณ ํ๋ก์ฐํด์ผํ๋ค. ๊ทธ๋ฐ ๋ถ๋ค์ ์ง์ ๋ณผ ์๋, ๊ฐ์ด ์ผํ๊ณ ์์ง๋ ๊ฐ๋ฅด์นจ์ ๋ฐ์ ๊ธฐํ๊ฐ ๋น์ฅ์ ์๊ธฐ ๋๋ฌธ์ ๊ต์ก์ด๋ ๊ฐ๋ฐ์ ์ ๋ฐฐ๋ค์ ์ฑ
์ ํตํด์ ๋ฐฐ์๋๊ฐ์ผ ํ๋ค. ์ด๋ฒ์ ๋ง์ ๋ฉํ ๋ถ๋ค๊ป ์ถ์ฒ๋ฐ์ ์ด ์ฑ
์ ์ฝ๋๊ฒ๋ง์ด ์๋๋ผ ์ฝ๋๋ก ์ง์ ๋ฐ๋ผํด๋ณด๊ณ ๊ทธ ๊ฐ๋
๋ค์ ์ฝ๊ฒ ์ ๋ฆฌํ๊ฒ๋ค์ ๋ค์ ์ดํด๋ณด๋ฉด์ ๋ด๊ฐ ์๋ชปํ๋๋ถ๋ถ, ๋ฐฐ์์ผํ ๋ถ๋ถ๋ค์ ๋ค์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
[Spring-LDW] ์คํ๋ง ๋ถํธ ์ฑ
ํ๊ถ ๋๋ด๊ธฐ ๋ชฉํ
Jar ๋น๋ ๋ฐ ์คํ์์์ ๋ฌธ์ ๋ฐ์
์ฐ์ ํ๋ก์ ํธ ๊ฐ๋ฐํ๊ฒฝ ์ธ ๋ค๋ฅธ PC์์์ ํ๋ก์ ํธ ํด๋ก , ์คํ ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ. DB ์ค์ ๊น์ง ๋๊ฐ์ด ๊ตฌ์ฑํ์ง๋ง ์ฒ์๋ณด๋ ์ค๋ฅ์์.
ํ์๋ฆฌํ ๋ทฐ๋ฆฌ์กธ๋ฒ์ ๋ฌธ์ ๋ฐ์. ๋ฉ์ธ ํ์ด์ง๋ ์ ์์ด ๊ฐ๋ฅํ๋ฐ ๋ค๋ฅธ ๋ชจ๋ ํ์ด์ง๊ฐ ์ ๊ทผ ๋ถ๊ฐ๊ฐ ๋ํ๋จ. ํ์ด์ง ๋๋ ๋ฐ์ดํฐ ๋ก๋ฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ๋ํ๋๋ Whitelabel Error๊ฐ ๋ํ๋๋ฉฐ

์๋ฒ ๋ด ์คํ ์ดํ ๋ํ๋์ค์ ์ค๋ฅ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์. ์ฃผ์ ๋ด์ฉ์ ๊ฒฐ๊ตญ THYMELEAF ์์ ๋ฐ์. ๋ชจ๋ ํ์ด์ง๊ฐ ์ ๊ทผ ๋ถ๊ฐ๋ฅ. ์ด์ํ๊ฒ ๋ฉ์ธํ์ด์ง๋ ์ ์์ด ๋๋ค?
ChatGPT ๋ํ ๋์๋์๊ฐ๋ ๋ง๋์๋๋ ํด๋์ค ํจ์ค์ ๊ด๋ จ๋ ํด๊ฒฐ์ฑ
์ ์ฃผ๊ธธ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค์ ์ฐจ์ด์ ์ ์ง์ ์ดํด๋ด
๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ / ์ฌ๋์์ ์ ๋ฌด์๋ค. ํด๋์คํจ์ค๋ ์ด๋ฏธ application.properties์์ ์ง์ ๋ ์ํ์ด๋ค.
[Spring][iLanD] [๋น๋] Jar ๋น๋ ์ดํ ์คํ ์ ํ์๋ฆฌํ ํธ๋ฌ๋ธ์ํ
[Spring][iLanD] [ํ๋ก์ ํธ์๋ฃ] ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ ์์ฐ
ํ PC(Windows) ์คํ ํ๊ฒฝ ์ค์
๋ณธ ํ๋ก์ ํธ๋ MacOS์์ ๊ฐ๋ฐ๋์ด ์ผ๋ถ ํ๊ฒฝ์ด ์์ดํ๋ค. ํ๋ก์ ํธ ์คํ์ Windows์์ ์๋ฒ๋ก ์คํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ์ด๊ธฐ ์ค์ ์ ํตํด์ ํ๋ก์ ํธ๋ฅผ ์คํ ํ ์ ์๋ค.
JDK-17 ์ค์น
๋ณธํ๋ก์ ํธ๋ Java๊ธฐ๋ฐ์ ํ๋ ์์ํฌ์ธ SpringBootํ๋ก์ ํธ๋ก JVM ๋ฐํ์ ํ๊ฒฝ์ด ํ์ํ๋ค. ๊ณต์ํํ์ด์ง์์ JDK17๋ฒ์ ์ ์ค์นํด์ค๋ค.

Windows์์๋ ๊ฐ๋จํ ํ์ผ์ ์คํ์์ผ ์ค์น ํ ์ ์์ผ๋ฉฐ ํฐ๋ฏธ๋์ ํตํด์ ์ค์น ์ํ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
[Spring][iLanD] [ํ๋ก์ ํธ์๋ฃ] ํOS ์คํํ๊ฒฝ ๊ตฌ์ถ๊ฐ์ด๋
๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฒ์์ ๊ตฌํํ์๋ค.
์บ์น๋ง์ธ๋์ ๊ฐ์ ์น์์ผ์ ํ์ฉํ ์ค์๊ฐ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์ ๋ค๋ฃจ๋ คํ์ผ๋, ์๊ฐ๋ณด๋ค ๋ชจ๋ฐ์ผ๊น์ง ๊ตฌํํด์ผํ๋ ๋์ด๋๊ฐ ์๊ณ , ๊ธฐํ์ ๋นํด ๊ท๋ชจ๊ฐ ์ปค์ง๊ฒ์ผ๋ก ์๊ฐ๋์ ๊ฐ๋ตํ ๋ฏธ๋๊ฒ์์ ์ค๋นํ๋ค.
5์น์ ๋จผ์ ์ฐจ์งํ๋ ๊ฐ์๋ฐ์๋ณด ๊ฒ์์ด๋ฉฐ ์๊ฐ๋ณด๋ค ์ฝ์ค๋ฅธ๋ค.


game.js
๋๋ถ๋ถ ๊ฐ๋จํ ๋ณ์์ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ฒ๋ฆฌํ์ผ๋ฉฐ ๋ชจ๋ฐ์ผ๋ก๋ ํ
์คํธ๋ฅผ ํ๋ค. ๋์์ ๋ฐ๋ผ 3๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ๊ธฐ๊ธฐ์ ๋ฐ๋ผ ์กฐ๊ธ ๋๋ฆฐ ๊ฒฝํฅ๋ ์๋๋ฐ ์คํ๋ ค ์ปดํจํฐ๊ฐ ์ผ๋นํ๊ฒ ๋ณ๊ฒฝํ๋๋ฏํ ๋ชจ์ต์ ์ด์ด ๋ฐ๋๋ค.
[Spring][iLanD] [Mini Game] ๊ฐ์๋ฐ์๋ณด ๊ฒ์ ๊ธฐ๋ฅ ๋ฃ๊ธฐ
์ด๋ฒ ํ๋ก์ ํธ์์ ๋ฐฐ์ด ํ์ผ์ ๋ํ ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ
๊ฐ๋ฌผ๊ฐ๋ฌผํ์ง๋ง ์์ ๋ถํฐ ํ๋ก์ ํธ์์ ์ด๋ฏธ์ง์ฒ๋ฆฌ๋ฅผ ์ํด์ img src์์ ์ธ๋ถ ๊ฒฝ๋ก๋ก ์ฐธ์กฐํ๋๊ฒ์ ์์๋ก ์ฒ๋ฆฌํ๋ฉด์ ๊ธฐ๋ณธ์ ์ธ CRUD์์๋ ํ์ผ์ ๋ํ ์ฒ๋ฆฌ์ ๋ฏธํกํจ์ด ์์๋ค. ์ด๋ฒ ํ๋ก์ ํธ์์ ์ ์๋๋๊ฐ์ ๋ํด ๊ตฌํ์ ์ง์คํ๋ค๋ณด๋๊น ๊นจ๋ฌ์ ๋ถ๋ถ์ด ์๋ค.
๋ถ๋ช
ํ ์์ ์ ๋ฐฐ์ด ๋ด์ฉ์ธ๋ฐ, ์ฝ๋์ธ๋ฐ ํ์ผ ์์ฒด๋ฅผ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ๊ฐ์ ์ก์๊ฒ ํฌ๋ค. Base64๋ก๋ง ํด๋ณด๊ณ ์์ง๋ง ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ๋ค์ ์์๊ฐ๋ณด๋ฉด ํจ์จ์ ์ธ๊ฒ ์์ง ์์๊น? ์ฐ์ ์ ๊ธฐ๋ฅ ๊ตฌํ ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋ ๋ถ๋ถ๋ค์ด ํด๊ฒฐ๋๋ฉด์ ๋ญ๊ฐ ์๋๋๊ฒ๋ค์ ํด๊ฒฐํด๋๊ฐ๋ ์์ ๊ฐ์ด ์๊ฒผ๋ค.
์์ ๋ชฉ๋ก์ ํฌ์คํฐ์์ ์์ฒญํ๋ฉด์ผ๋ก ์ง์


[Spring][iLanD] [Base64] Video ํ์ผ ์ถ๊ฐ, Img ํฌ์คํฐ์ ๋ถ๋ฆฌ, Video ํ์ผ ์ฒ๋ฆฌ ๋ก์ง ๋ถ๋ฆฌ, ์ธ์ฝ๋ฉ ํ ์ด๋ฏธ์ง ์ถ๋ ฅ, Video ํ๊ทธ๋ฅผ ํตํ ์์ ์ฌ์
์ค์๊ฐ ์ฑํ
๊ธฐ๋ฅ์ด ์ด๋์ ๋ ๊ตฌํ๋์์ผ๋ ๋ค๋ฌ๊ธฐ๋ฅผ ๋ค์ด๊ฐ๋ค. ย
์ํ๋๊ฑด ์ฑํ
์ ๊ตฌ๋ถ์ด ์๋๋๊ฒ๊ณผ ์๋ด์ ๊ฐ์ ๋ถ๋ถ์ด ๋ถ์กฑํ๋ค.
์นดํก๊ณผ ๋น์ทํ๊ฒ ๊ตฌํํด๋ณด๊ณ ์ถ๋ค. ๊ตฌํ๋ ๋ชจ์ต์ ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค. ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด์ ๋ก๊ทธ์ธ๋ ์ ์ ์ ๋ก๊ทธ์ธ๋์ง ์์ ์ ์ ์ ์ํฉ์ ์ฐ์ถํ๋ค.
chatting.js
์ ๋ฐ์ ์ผ๋ก ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ธดํ๋ค. ๋ก๊ทธ์ธ์ ์์ฑ๋๋ ํด๋ผ์ด์ธํธ ์ฟ ํค๋ก๋ถํฐ ์ฌ์ฉ์ ์ด๋ฆ์ ๋ฐ์์ค๋๋กํ๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๋ก user์ Authentication์ ๋ฐ์์ค๋ ๊ฒ์ ๊ตฌํํด๋ณด๊ณ ์ถ๋ค.
CSS๋ฅผ ํตํด ์นดํกlike ๋ฉ์ ์ ์์์ ์
ํ๋ณด์๋ค.
chatting.html
html์ ๊ทธ๋๋ก์ด๋ค.
[Spring][iLanD] [Web Socket] ์ค์๊ฐ ์ฑํ
๊ธฐ๋ฅ ๋ค๋ฌ๊ธฐ
์น ์์ผ์ ํ์ฉํ ์ฑํ
๊ธฐ๋ฅ ๊ตฌํ ๊ณผ์
์น์์ผ์ ํ์ฉํ ์ฑํ
๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ํ๋ค.
์์กด์ฑ ์ถ๊ฐbuild.gradle ์ ์์กด์ฑ ์ถ๊ฐ
Configuration ์ถ๊ฐ
๋ทฐ ์ปจํธ๋กค๋ฌ ์ถ๊ฐ
chatting.html
chatting.js
Controllers
์ฐ์ ์ฑํ
ํ์ด์ง๋ฅผ ๋ฐํํ๋ ๋ทฐ์ปจํธ๋กค๋ฌ
[Spring][iLanD] [Web Socket] ์ค์๊ฐ ์ฑํ
๊ธฐ๋ฅ ๊ตฌํ
img src์์ ํ๋ก์ ํธ ๋ด๋ถ ๊ฒฝ๋ก์ธ์ ์์คํ
๊ฒฝ๋ก ํ์ผ ์ธ์ง ๋ถ๊ฐ๋ฅํ ๋ถ๋ถ
<img src="/uploads/${originFileName}" ์ฒ๋ผ ์ผ๋ฐ img src๋ก ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ฉด context ๊ฒฝ๋ก๊ฐ ์ด๋ฏธ localhost:8080 ์ด ์กํ์๊ธฐ ๋๋ฌธ์ ์์คํ
๊ฒฝ๋ก๋ก ์ ๊ทผ ํ ์ ์์๋ค.

๋ณด์์ ๋ถ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฐ๊ตญ ์๋ฒ๋ก๋ถํฐ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ฐ์์์ผํ๋ค. ์ด๋ฅผ ์ต์ง๋ก ๊ตฌํํ๊ธฐ ์ํด์ ๋ฐ์ดํฐ ์ ์ฅ ์
์ ์ฝ๋์ฒ๋ผ dir2๋ก ํ๋ก์ ํธ ๋ด๋ถ๋ก ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ผ๋ถ ์๋๋๋๋ก ๊ตฌํํ์์ง๋ง ๋ฌธ์ ๊ฐ ์์๋ค. ์ด๋ฏธ์ง ๋ก๋๋ฅผ ์ํด์๋ ์๋ฒ๊ฐ ์ฌ์์๋์ด์ผํ๊ณ ๊ทธ ์ ๊น์ง๋ JSON ํ์
์ ์์ฒญ๋ง ๊ฐ๋ฅํด์ ธ์ ์ด๋ฏธ์ง ์์ฒด๊ฐ ๋ก๋๋์ง ์์๋ค. ์ด๊ฑด ์ฌ์ค ๋ถํ์ํ ๋ฐ์ดํฐ ์ค๋ณต, ๋ณต์ฌ์ด๋ฉฐ ์ผ๊ด์ฑ์ ํด์น ์ ์๋ค.

[Spring][iLanD] [File] TroubleShooting - ํ์ผ ์ธ์ฝ๋ฉํด์ ์กฐํํ๊ธฐ
๊ธฐ์กด HTML ํ๊ทธ ๋ฐ CSS์ ์๋ ์ด์์ผ๋ก ์ ์ฒด์ ์ผ๋ก ์์


[Spring][iLanD] MVP - [AboutUs] @media ํ๊ทธ๋ฅผ ์ด์ฉํ ๋ฐ์ํ ์ค๋ฒ๋ ์ด ํ
์คํธ๋ฐ์ค
ํ์ผ ์
๋ก๋ ์์น ๋ณ๊ฒฝ
ํ์ผ์ ์์คํ
๊ฒฝ๋ก๋ก ํ๋ ๊ฒฝ์ฐ ssh๋ฑ ํ์ผ ์๋ฒ์์ฒด๋ฅผ ๊ตฌ์ฑํด์ ์ ์ํด์ผํ๋ค. AWS S3์ ๊ฐ์ ํ์ผ์๋ฒ๊ตฌ์ฑ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ๋ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑํ๊ธฐ ์ํด ํ๋ก์ ํธ ๋ด๋ถ๊ฒฝ๋ก์ ํ์ผ์ ์
๋ก๋ํ๊ณ , ํ์ผ์ ๊ฐ๋จํ๊ฒ ๋ถ๋ฌ์ค๊ฒ ํ๊ณ ์ํ๋ค.
์ด๋ฅผํตํด ํ์ผ์
๋ก๋๊ด๋ จ CRUD๊ฐ ์๋ํ๋ฉด ํด๋น ๋ถ๋ถ์ ํ์ผ์ด ์
๋ก๋ ๋๋ ์ญ์ ๊ฐ ์ค์๊ฐ์ผ๋ก ์งํ๋๋ค.

๋ฏธ๋ฆฌ๋ณด๊ธฐ
ํ์ผ์ ์
๋ก๋ํ ๊ณต์ง๊ธ๊ณผ ๊ฐ์ ๊ธ์์ ํ์ผ(์ด๋ฏธ์ง)๊ฐ ์ ์ ๋ก๋๋๋์ง ํ์ธํ๊ณ ์ํ๋ค.
[Spring][iLanD] MVP - [File] ํ์ผ ์
๋ก๋ ํ๋ก์ ํธ ๊ฒฝ๋ก์ด๋ ๋ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํ
Create๋ฅผ ์ฐธ๊ณ ํ์ฌ Update๋ฅผ ์์ฉ
์๋ก์ด ํ์ผ์ด ์
๋ก๋๋๋ค.



ํ์ง๋ง ๋ฌธ์ ๋ ๊ธฐ์กด ํ์ผ์ด ๋จ์์๋ค๋ ๊ฒ
์ ์ ๊ฐ ์ด๋ค ๊ธ์ ์ฒจ๋ถํ์ผ์ ์๋ก ์
๋ก๋ํ๋ค๋ ํ์๋ ๋ค์๊ณผ ๊ฐ์ด ํ๋ก์ฐ๋ฅผ ์๊ฐํ ์ ์๋ค.
โข
๊ณต์ง ์
๋ฐ์ดํธ ์์ฒญ์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ์ผ๋จ ์ธ๊ฐ์ง๋ก ๋๋ ์ง๋ค.
[Spring][iLanD] MVP - [File] ํ์ผ ์
๋ก๋ ์
๋ฐ์ดํธ API ๊ตฌํ
์ต์ข
ํ๊ฒฝ ๊ตฌ์ถ ํ๋ฉด

๋ชจ๋ฐ์ผ๋ฒ์ ์์์ ์คํ ํ
์คํธ ํ๋ฉด
ํ๊ฒฝ ๊ตฌ์ถ ์ ๊ฒฝ ์ฌ์ง์๋ฃ๋ค



[Spring][iLanD] [ํ๋ก์ ํธ์๋ฃ] ์ธ๋ถ ์ ์ ํ๊ฒฝ ๊ตฌ์ฑ ์๋ฃ ๋ชจ์ต
Notice : File ํ
์ด๋ธ์ 1:N ์ฐ๊ด๊ด๊ณ๋ก ์ค์ ๋์ด์์
orphanRemoval = true ๋ฅผ ํตํด ๊ณต์ง๊ฐ ์ญ์ ๋๋ฉด ํ์ผ์ ์ฐ๊ด๊ด๊ณ๊ฐ null๋ก ์ฌ๋ผ์ง๋ฏ๋ก ํจ๊ป ์ญ์ ๋๋ค. ํด๋น ์ต์
์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ ์๊ฐํด์ ์ ์ฉํด์ผํ๋ค. ํนํ User์ ์๋ชป ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ user๊ฐ ์์ฑํ ๊ฒ์ํ, ๊ฒ์๊ธ, ๋ชจ๋ ์ฌ๋ผ์ง ์ ์๋ค.
ํ
์คํธ
18๋ฒ ๊ณต์ง๋ฅผ ์ญ์ ํ์ผ๋ฉฐ, ์ด๋ 2๊ฐ์ด์์ ํ์ผ์ด ์ฐ๊ฒฐ๋์ด ์์๋ค.

๊ณต์ง๊ฐ ์ญ์ ๋์์ผ๋ฉฐ

[Spring][iLanD] MVP - [File] ๊ณต์ง ์ฐ๊ด๊ด๊ณ ์ญ์ ์ ํ์ผ ์ญ์ ๊ตฌํ
์ต์ด ์๋(์ค๋ณต ๋ฎ์ด์ฐ๊ธฐ ๋ฐ์)


์ค๋ณต ํ์ฉ์ ์ํ์ฌ noticeId๋ฅผ ๊ธฐ์ค์ผ๋ก UUID ์ถ๊ฐ



multipart ํ์ผ ์
๋ก๋๋ ํ์๋ผ ์ฒจ๋ถ์์ด ์ผ๋ฐ ๊ณต์ง๋ฅผ ๋ชป์ฌ๋ฆฌ๋ ๋ฌธ์ ๋ฐ์
[Spring][iLanD] MVP - [File] ํ์ผ ์
๋ก๋ API ๊ตฌํ
ํฐ๋ฏธ๋๋ก springboot ํ๋ก์ ํธ๋ฅผ ์คํํ๊ณ ์ ์์ํ ํ์ธ
ํด๋นํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์ด๋ํด์ bootRun ๋ช
๋ น์ด๋ก ์๋ฒ์์ ์คํ์ํจ๋ค.

ํด๋น ์๋ฒ localhost์์๋ ๋น์ฐํ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ํ๋ฉฐ,

๋ฌด์ ์ผ๋ก ๋ด๋ถ ๋คํธ์ํฌ(์ธํธ๋ผ๋ท) ์ฐ๊ฒฐ๋ ํ๊ฒฝ์์๋ ์ง์ ๋ด๋ถIP๋ฅผ ํตํด์ ์ ์ ๊ฐ๋ฅํ ํ๋ฉด์ ํ์ธ ํ ์ ์๋ค.
[Spring][iLanD] ์ธํธ๋ผ๋ท ์คํ ํ๊ฒฝ ๊ฐ๋จ ํ
์คํธ
ํ์ด์ง ์ฒ๋ฆฌ ๊ตฌํ

[Spring][iLanD] MVP - [Notice] ํ์ด์ง ์ฒ๋ฆฌ ๊ตฌํ
๋ก๊ทธ์ธ ํ์ด์ง ๊ตฌํ API ์ฐ๊ฒฐ

๊ณต์ง ์์ฑ ๊ธฐ๋ฅ

๊ณต์ง ์์ ๊ธฐ๋ฅ


๊ณต์ง ์ญ์ ๊ธฐ๋ฅ
[Spring][iLanD] MVP - [Admin] ๋ก๊ทธ์ธ ํ๋ก ํธ ์ฐ๊ฒฐ ๋ฐ ๊ด๋ฆฌ์ ํ์ด์ง ๊ตฌํ
์น ์์ผ์ ํ์ฉํ ์ค์๊ฐ ๊ทธ๋ฆผํ ๊ธฐ๋ฅ
๋ชจ๋ฐ์ผ ํฐ์น ๋ฐ์์ด ์์ด์ ์ ์ธ๋จ
JS๋ก ๊ฒ์์ ๋ฃ๋๊ฒ ์ฌ์ดํธ, ๊ฒ์ ์์ฒด๋ง์ผ๋ก ํ๋์ ํ๋ก์ ํธ๊ธ์ด๋ผ ํด๋น ํ๋ก์ ํธ์์๋ ๊ตฌํ ์ด๋ ค์
์น ์์ผ์ ํ์ฉํ ์ฑํ
์๋ฒ ๊ธฐ๋ฅ
[Spring][iLanD] ์ฌํ ๊ธฐ๋ฅ ๋ ํผ๋ฐ์ค ํ์
Home์ ๋ค๋น๊ฒ์ด์
์ ์ฉ ๋ฐ Footer ๊ณ ์

992px ์ดํ(๋ชจ๋ฐ์ผ), ๊ทธ ์ด์ ํ๋ธ๋ฆฟ(1200px), ๊ทธ์ด์ ๋ฐ์คํฌํ
์์ด์ฝ ๋ฐฐ์น๊ฐ ์ ์ ํ๊ฒ ๋ถ๋ฐฐ๋๋๋ก, ๋ชจ๋ฐ์ผ ๋ฒ์ ์์๋ 2์ด, ๊ทธ ์ด์ ๋ฒ์ ์์๋ 3์ด ๋ฐฐ์น

[Spring][iLanD] MVP - [Home] @media ํ๊ทธ๋ฅผ ์ด์ฉํ ๋ฉ์ธ ํ์ด์ง ๋ฐ์ํ ๋ฉ๋ด ๋ณ๊ฒฝ ์ ์ฉ
์ฐธ๊ณ ์๋ฃ
์คํ๋ง ๋ถํธ ํ์ผ ์ ๋ก๋ / ํ์ผ ๋ค์ด๋ก๋
โข
MultipartFileย ํด๋์ค ์ฌ์ฉ
โฆ
์์กด์ฑ ํ์ ์์
โฆ
application.properties ํ์ผ์์ ํ์ผ ์ต๋ ํฌ๊ธฐ๋ง ์ค์
โข
์๋์ผ๋ก MultipartConfigElement ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋ก
โข
ํ์ผ๋ช
์ค๋ณต๋์ง ์๋๋ก UUID ์ฌ์ฉ
โฆ
์ํํธ์จ์ด ๊ตฌ์ถ์ ์ฌ์ฉ๋๋ ์๋ณ์ ํ์ค
โฆ
16 ์ฅํ
(128๋ฐ์ดํธ)์ ์
โฆ
ํ์ค ํ์์์ UUID๋ 32๊ฐ์ 16์ง์๋ก ํํ๋๋ฉฐ ์ด36๊ฐ ๋ฌธ์(32๊ฐ ๋ฌธ์์ 4๊ฐ์ ํ์ดํ)๋ก ๋ 8-4-4-4-12๋ผ๋ 5๊ฐ์ ๊ทธ๋ฃน์ ํ์ดํ์ผ๋ก ๊ตฌ๋ถ
โฆ
์๋ฐ UUID ํด๋์ค์ randomUUID() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ ์ผํ ์๋ณ์ ์์ฑ
์คํ๋ง ๋ถํธ ํ๋ก์ ํธ์์ ํ์ผ ์ ๋ก๋ / ๋ค์ด๋ก๋ ์์
ํ์ผ ์ ๋ก๋
โข
ํ์ผ๋ช
์ค๋ณต๋์ง ์๋๋ก ํ์ผ ์ด๋ฆ ๋ณ๊ฒฝํด์ ์
๋ก๋
โข
ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ ์
๋ก๋
โข
์๋ณธ ํ์ผ๋ช
๊ทธ๋๋ก ์
๋ก๋
ํ์ผ ๋ค์ด๋ก๋
โข
ํด๋ ๋ด ํ์ผ ๋ชฉ๋ก์์ ์ ํํด์ ๋ค์ด๋ก๋
ํ์ผ ์ ๋ก๋ ์์ 1
โข
ํ์ผ๋ช
์ค๋ณต๋์ง ์๋๋ก ํ์ผ ์ด๋ฆ ๋ณ๊ฒฝํด์ ์
๋ก๋
[Spring][iLanD] MVP - [File] ํ์ผ ์
๋ก๋ API ๋ ํผ๋ฐ์ค ํ์
๊ณต์ง์กฐํ(์ ์ ) Ajax๋ฅผ ํตํ ์ฐ๊ฒฐ



์ค์ ๊ณต์ง ๊ตฌ๋ถ


[Spring][iLanD] MVP ํ๋ก ํธ์๋์ API ์ฐ๊ฒฐ 1์ฐจ ๊ธฐ๋ณธ CRUD, Ajax๋ก ๋์ ๋ค๋น๊ฒ์ด์
๊ตฌํ
์์ CREATE


์์ READ


[Spring][iLanD] MVP - [Video] ์์ CRUD API
CREATE

READ


UPDATE
[Spring][iLanD] MVP - [Info] ์ ๋ณด API
๊ฒ์ํ ์์ฑ, ์์ , ์ญ์ , ์กฐํ ๊ตฌํ
๊ฒ์ํ์ ์ด 4๊ฐ๋ก ๊ตฌ์ฑ๋ ์์
๊ฐ ๊ฒ์ํ์ ์์ ๋ณ๊ฐ์ ํ
์ด๋ธ๋ก ๊ตฌ์ฑํด๋๋์ง๋ง ๊ณตํต ๋ถ๋ถ์ ๋ถ๋ชจ ํ
์ด๋ธ๋ก ๊ตฌ์ฑํด์ ์ถํ ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ์ ๊ณ ๋ ค
๊ฐ ๊ฒ์ํ์ ๊ฒ์๊ธ๋ค์ด ์์์์๋ก ์ถ๊ฐ๋ ๊ฒ์
Create ํ
์คํธ


Update ํ
์คํธ
[Spring][iLanD] MVP - [Boards] ๊ฒ์ํ CRUD API
๊ณต์ง ์์ฑ


๊ณต์ง ์์



๊ณต์ง๊ธ ์ญ์
[Spring][iLanD] MVP - [Notice] ๊ณต์ง CRUD API
๊ฒ์ํ - ๊ฒ์๊ธ(4์ข
) - ํ์ผ
๋ชจ๋ ์ฝํ
์ธ ๋ ์ฌ์ค ๊ฒ์๊ธ์ด๋ผ ๋ณผ ์ ์๋ค. ๊ทธ ์ปฌ๋ผ์ ๋ด์ฉ์ด ๋ฌ๋ผ์ง๊ฑฐ๋ ์์น๋ง ๋ฌ๋ผ์ง ๋ฟ, ํ์ผ์ด ์๋๊ฒ ์๋๊ฒ ์ถํ์ ์ถ๊ฐ๊ฐ ํ์ํ ๊ฒ์ ๊ณ ๋ คํ์ฌ ํ์ผ ํ
์ด๋ธ์ ๋ณ๋๋ก ๋ถ๋ฆฌํ๊ณ ์ฐ๊ด๊ด๊ณ๋ก ์ฒ๋ฆฌํ๋ค.
Board.java
๊ฒ์ํ์ ํ์ด๋๋ ๊ฒ์ํ ์ํฐํฐ์ด๋ค. ๊ฐ ๊ฒ์๊ธ๋ค์ ์ข
๋ฅ๋ฅผ @OneToMany ์ฐ๊ด๊ด๊ณ๋ฅผ ํตํด์ ๊ฐ ๋ฆฌ์คํธ๋ค์ ๊ฐ์ ธ์ค๋๋ก ์ค์ ํ๋ค.
Notice.java
์ฒซ๋ฒ์งธ ๊ฒ์๊ธ์ ์ํฐํฐ์ธ ๊ณต์ง ๊ฒ์๊ธ์ด๋ค. ๊ฒ์ํ:๊ณต์ง๊ฒ์๊ธ ์ 1:N ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ์ด๊ฒ๊ณผ ๋์ผํ๊ฒ Info, Video, Game ๊ฒ์๊ธ์ด ๋์ผํ ์ปฌ๋ผ, ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๋ํ์ ์ผ๋ก Notice๋ถ๋ถ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
File.java
Notice, Info, Video, Game ๊ฒ์๊ธ ๋ชจ๋ ํ์ผ์ด ์ฒจ๋ถ๋ ์ ์๋ค. ํ์ฌ Game๋ถ๋ถ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ์ข ๋ ์ฌ๋ก๋ฅผ ์ฐพ์๋ด์ผํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌด์ธ๊ฐ ์ฌ๋ฌ ์ข
๋ฅ ๊ฒ์์ ์ฌ๋ฆฐ๋ค๋ ์๋ฏธ์์๋ ๊ฒ์๊ธ๊ณผ ๋์ผํ ๊ฒ์ผ๋ก ์๊ฐํ์ผ๋ฉฐ ์ผ๋จ ๋๋ฏธ๋ก ์์ฑํด๋์๋ค.
File์ Multipart๋ก ์
๋ก๋ํ๋ ์์ผ๋ก ์๋ฒ๋ด ํน์ ๊ณต๊ฐ์ ์ ์ฅ๋๋๋ก ํ ๊ฒ์ด๋ฉฐ, ์ด๋ฏธ์ง๋ ์์์ ํด๋น ๊ฒฝ๋ก์์๋ถํฐ ์ถ์ถํ์ฌ ์คํ ๋๋ ๋ก๋ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ผ๋ก ํ๋จ๋๋ค.
์ฌ๋ฌ ํ์ผ๋ค์ด ์ฒจ๋ถ๋ ์ ์๋ ์ํฉ์ ๊ณ ๋ คํ์ฌ 1:N ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งตํํ๋ค.
JPA์ ์ํด ์๋์ผ๋ก ํ
์ด๋ธ์ด ์์ฑ๋๋ค.
์ด์ ๊ณต์ง ๊ฒ์ํ CRUD๋ฅผ ๊ตฌํํ๋ฉด ์ฌ์ค ๋ค๋ฅธ ๋ถ๋ถ๋ค์ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ์ ๋ค๋ฅผ๋ฐ ์๋ค. ํ์ผ ์
๋ก๋์ ๋ก๋ ๋ถ๋ถ์ ์ ์ฒดํฌํด์ผ ํ๋ค.
[Spring][iLanD] MVP - ์ฃผ์ ์ํฐํฐ ์์ฑ ๋ฐ ์ฐ๊ด๊ด๊ณ ๊ตฌ์ฑ
์ ์ฒด ๊ณผ์
1.
์์กด์ฑ ์ถ๊ฐ
2.
UserDetailsImpl ์์ฑ
3.
UserRepository ์ถ๊ฐ
4.
UserDetailsService ์์ฑ
5.
JWT์ ํธ ํด๋์ค ์ถ๊ฐ
6.
JWTํํฐ ์ถ๊ฐ
7.
์คํ๋ง ์ํ๋ฆฌํฐ ์ค์
8.
์คํ๋ง ์ค์
9.
์ปจํธ๋กค๋ฌ ์ค์
์ถํ Refresh Token ์ฐธ๊ณ ์๋ฃ
์์กด์ฑ ์ถ๊ฐ
UserDetailsImpl.java
[Spring][iLanD] MVP - [Auth] SpringSecurity JWT+์ฟ ํค ๋ฐฉ์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ
ํ์ ๊ฐ์
, ์์ , ํํด API ๊ตฌํ
โข
๋น๋ฐ๋ฒํธ๋ SpringSecurity์ BCryptPasswordEncoder๋ฅผ ํตํด ๊ธฐ๋ณธ ๋จ๋ฐฉํฅ ํด์ ์๊ณ ๋ฆฌ์ฆ BCrypt ๋ก ๋ณตํธํ ๋ถ๊ฐ๋ฅํ ์ํธํ ๊ธฐ๋ฅ์ ํ์ฉ
โฆ
PasswordEncoder.java configํจํค์ง์ ๋ณ๋๋ก ์์ฑํ์ฌ ์ ์ํ์ผ๋ฉฐ ํ์ ํด๋์ค(UserService)์ ์ฃผ์
๋๊ณ ์ฌ์ฉ๋จ
โฆ
BCrypt๋ ์์ ํ ํด์ ํจ์๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ํด์๋ ๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ์ํธ(salt)๋ฅผ ํตํด ๋ณด์์ฑ์ ๊ฐํ
โข
๊ธฐ๋ณธ์ ์ผ๋ก ์
๋ ฅ๊ฐ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ ๋ค์๊ณผ ๊ฐ์
โฆ
ํ์์ ๋ก๊ทธ์ธ ์์ด๋๊ฐ ๋ e-mail์ UK๋ก ์ค๋ณต์ด ๋ถ๊ฐ๋ฅ, @Email ์ด๋
ธํ
์ด์
์ ๋ฐ๋ฅธ ์ด๋ฉ์ผ ์ ํจ์ฑ ๊ฒ์ฌ
โช
ex)abc@abc.com
โฆ
์ด๋ฆ์ ํ๊ธ 2~4๊ธ์๊น์ง ํ์ฉ
โช
ex)๊นํ
์ค, ๊นํ
, ๊นํ
์คํธ OK
โฆ
๋น๋ฐ๋ฒํธ๋ ๋น๋ฐ๋ฒํธ๋ 8~15์ ์๋ฌธ ๋ ์๋ฌธ์, ์ซ์, ํน์๋ฌธ์๋ฅผ ํฌํจํด์ผ ํจ
โช
ex)test1234!
โข
usertype์ ํ๋ก ํธ์์ ๋๋กญ๋ค์ด๋ฐ์ค๋ก value๋ฅผ 0,1,2 ๋ฅผ ์ ๋ฌํ๋๋ก ์ค๊ณํ ์์
โฆ
0์ธ ๊ฒฝ์ฐ USER
โฆ
1์ธ ๊ฒฝ์ฐ ADMIN ํ์ ๊ฐ์
์ด ๊ฐ๋ฅํ์ง๋ง, token ํ๋๋ฅผ ์๋ชป ์
๋ ฅํ๋ฉด ๊ฐ์
๋ถ๊ฐ, โadminโ์ ์ ํํ ์
๋ ฅํด์ผ admin ํ์ ๊ฐ์
์๋ฃ
โฆ
2์ธ ๊ฒฝ์ฐ STAFF ํ์ ๊ฐ์
์ด ๊ฐ๋ฅํ์ง๋ง, token ํ๋๋ฅผ ์๋ชป ์
๋ ฅํ๋ฉด ๊ฐ์
๋ถ๊ฐ, โstaffโ์ ์ ํํ ์
๋ ฅํด์ผ staff ํ์ ๊ฐ์
์๋ฃ
UserSignupRequestDto.java
UserUpdateRequestDto.java
UserController.java
UserService.java
UserRepository.java
ํ
์คํธ
[Spring][iLanD] MVP - [Users] ํ์ CUD API
ย ํ์ ๊ฐ์
๋ฐ ๋ก๊ทธ์ธ ๊ตฌํ - staff only (๋นํ์์ ๋ชจ๋ ์ ์ )
โข
ํ์ ๊ฐ์
์์
โฆ
ํ์ ์์ด๋
โฆ
๋น๋ฐ๋ฒํธ
โฆ
์ด๋ฆ
โฆ
์ ์ ํ์
RoleEnum ๊ตฌํ (staff์น๋ฌด์ / admin๊ด๋ฆฌ์ / โuserโ or none)
โช
ํ์๊ฐ์
์ ์ผ๋ฐ ์ ์ ๊ฐ ๋ชปํ๋๋ก ์ํฌ๋ฆฟ ํค๋ฅผ ๋ฑ๋กํ๋๋กํจ ๊ทธ ์ธ ์ ํจ์ฑ์ฒดํฌ๋ก ์ ๊ทผ ๋ถ๊ฐ
โข
๋ก๊ทธ์ธ
โฆ
๊ธฐ๋ณธ ์ ๋ณด
โช
DB์ ์์ด๋
โช
DB์ ๋น๋ฐ๋ฒํธ
โฆ
JWT ํ ํฐ+์ฟ ํค ์์ฑ ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ ์ธ์ฆ/์ธ๊ฐ ๊ตฌํ
ย Notice ๊ณต์ง๊ฒ์ํ
โข
CREATE - admin or staff only (์ค์๊ณต์ง์ปฌ๋ผํ์)
โข
READ
โฆ
admin
โฆ
user
โข
UPDATE - admin or staff only
โข
DELETE - admin or staff only
ย Movie&TV ์ปจํ
์ธ ๊ฒ์ํ
โข
CREATE - admin or staff only
โฆ
multipartํ์ผ์
๋ก๋๋ฅผ ํตํด ์๋ฒ์ ์ ์ฅ ํ ์ ์๋ ๊ธฐ๋ฅ ํ์ธ ํ์(๋์ฉ๋ ๊ฐ๋ฅ์ฑ์์)
โข
READ
โฆ
admin or staff
โฆ
user or none
โช
์์ ์คํธ๋ฆฌํ ํ์ด์ง๋ก ์ฌ์ ๊ฐ๋ฅํ์ง ํ์ธ ํ์
โข
UPDATE - admin or staff only
โข
DELETE - admin or staff only
ย ์ฑํ
๊ธฐ๋ฅ
โข
WebSocket์ ํตํ ๊ตฌํ ํ์ธ ํ์
[Spring][iLanD] ๊ธฐ๋ฅ ๋ถ๋ฅ
SpringBoot ํ๋ก์ ํธ ๊ตฌ์กฐ ์์ฑ

HomeController๋ฅผ ํตํ ๋ฉ์ธํ์ด์ง HTTP์์ฒญ ์ ๊ทผ ์ํ ํ์ธ

โข
์์กด์ฑ ์ฃผ์
dependencies {
//SpringBoot AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'
//THYMELEAF
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
//JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
//SpringBoot JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//SpringBoot Security
implementation 'org.springframework.boot:spring-boot-starter-security'
//SpringBoot Thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
//SpringBoot Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
//SpringBoot WEB
implementation 'org.springframework.boot:spring-boot-starter-web'
//SpringBoot Thymleaf Security
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
//Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//MySQL
runtimeOnly 'com.mysql:mysql-connector-j'
//JSON
implementation 'org.json:json:20230227'
//SpringBoot Test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//SpringBoot Security Test
testImplementation 'org.springframework.security:spring-security-test'
}
Shell
๋ณต์ฌ
[Spring][iLanD] ๊ธฐ์ด ํ๋ก์ ํธ ๊ตฌ์กฐ ์์ฑ ๋ฐ ์์กด์ฑ ์ฃผ์
, ํ
์คํธ
ERD ์์ฑ
๋๋ฉ์ธ๋ณ DB ๊ตฌ์กฐ ์ค๊ณ

๊ฐ๋ฐ์ฉ IDE - ๋ก์ปฌ DB์์ฑ ๋ฐ DB ์ปค๋ฅ์
ํ์ธ
Entity ํด๋์ค ์์ฑ
[Spring][iLanD] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ 1์ฐจ(ERD)
ํ๋ก ํธ์๋ ์ปจ์
๋์์ธ
์ฃผ์ ์ปจํ
์ธ ๋์์ธ
[Spring][iLanD] ํ๋ก์ ํธ ๋๋ฉ ๋ฏธํ
, ํ๋ก ํธ์๋ ๋์์ธ ๊ตฌํ ์ํ, ์ฝ๋ ํ์ธ, ๊ณผ์
๋ฒ์ ํ์ธ
ํ๋ก์ ํธ ํ๊ธฐ
๋ฐฑ์๋ ์ฑ๋ฆฐ์ง์ ๋ํ ํ๊ณ
๋ฐฑ์๋ ์
์ฅ์์ ํ๋ก ํธ์๋์ ๋ํ ํ๊ณ
๊ธฐํ ๋๋์
[Spring][258] ํ๋ก์ ํธ ์๋ฃ ํ๊ธฐ ํ๊ณ , ๋ฐฐ์ด์ ๊ณผ ์์ฌ์ด์

[Spring][iLanD] ํ๋ก์ ํธ ์งํ ๋ก๋๋งต ์์ฑ
ํ๋ก์ ํธ ์์ฑ ๋ฐ .gitignore ๋ฑ๋ก ๋ฐ Git Init Commit
Github Remote Repository ์์ฑ

[Spring][iLanD] Git, Github ์ ์ฅ์ ์ฐ๊ฒฐ ๊ด๋ฆฌ
ํ๋ก์ ํธ ์ถ์ง ์ด์
์ฃผ๋ณ ๋คํธ์ํฌ๋ฅผ ํตํด ์์ง๋ง ์ค์ ๊ณผ ๊ฐ์ ๊ฒฝํ ๋์์ ์ฃผ๊ฒ ๋ค๋ ์ ์๊ฐ ๋ค์ด์์ผ๋ฉฐ ๊ฐ์ฌํ ๋ง์์ ๋คํด ์ต์ ์ ๋คํด ๋ฐฐ์ด ๊ฒ๋ค์ ํ ๋๋ก ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด๊ณ ์ ํฉ๋๋ค.
๊ต์ก๊ณผ์ ์์์ ์ฌ๋ฌ ํ ํ๋ก์ ํธ์ ๋ฌ๋ฆฌ ๋ณธ์ธ ์ค์ค๋ก ์ด๋์ ๋ ๊ฐ๋ฐ ํ ์ ์์์ง, ์ด๋ ๋ถ๋ถ๋ค์ด ๋ถ์กฑํ์ง ์ค์ ์ผ๋ก ๊ฒฝํํ๊ณ ์ถ์์ผ๋ฉฐ ํ ํ๋ก์ ํธ ํน์ฑ์ ๋ถ์
๊ณผ์ ์์ ์ง์ ๋ชป ๋ค๋ฃจ์ด๋ณธ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์ค์ค๋ก ๊ตฌํํด ๋ณผ ์ ์๋ ์ข์ ๊ธฐํ๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๋ณธ์ธ์ ๊ฐ๋ฐ ๋ฒ์, ํํฉ ํ์
โข
๊ฐ๋จํ Figma๋ฅผ ํตํด ์ ์๋ ์ปจ์
๋์์ธ์ ์์ผ๋ ๋ฐฑ์๋ API ๊ตฌ์ฑ์ ์ ํ ์๋ ์ํ
โข
API ๊ฐ๋ฐ์ด ํ์ํ๋ฉฐ ์ด์ ๋ฐ๋ผ ํ๋ก ํธ์๋์ ์ฝ๋ ๋๋ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์
โข
๋์์ธ๊ณผ ์ปจ์
, ์๊ตฌ ๊ธฐ๋ฅ์ ์ต๋ํ ์ ์ง
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ํ์
โข
Java ๊ธฐ๋ฐ์ SpringBoot ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฐ์์ ๊ฒฝํ์ , ๊ธฐ๊ฐ์ , ๊ฐํธ์ฑ์ ์ ํฉ
โข
์๋ฒ ๋ฐ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ ์ดํ ์ต์ข
์ ์ผ๋ก ๋ด๋ถ ์คํํ๊ฒฝ์ ๊ตฌ์ถํด์ฃผ๊ณ ์ธ๋ถ์ ์ ํ
์คํธํ๋ ๊ณผ์ ๊น์ง ํ์

[Spring][iLanD] ๊ฐ๋ฐ ๊ณ์ฝ ์ฒด๊ฒฐ ๋ฐ ์ถ์ง ์ด์ , ๋ฒ์
Elasticsearch๋ ๋ํ ๋ด๋ถ์ ์ผ๋ก ์ ์์ ์ ์ด๋ฉฐ, ์ด๋ค ์๊ณ ๋ฆฌ์ฆ, ์๋ฃ๊ตฌ์กฐ ๋ฑ๋ฑ์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ๊ฒ์ด ๋ณด์ฅ๋๋์ง์ ๋ํ ์ดํด๋ ์ถ๊ฐ ํ์
Elasticsearch๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ ์ ์ด๋ฉฐ ๋น ๋ฅธ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
1.
๋จผ์ , Elasticsearch๋ Apache Lucene์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ต๋๋ค. Lucene์ ๊ฒ์ ์์ง์ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ
์คํธ ์ธ๋ฑ์ฑ๊ณผ ๊ฒ์์ ํนํ๋ผ ์์ต๋๋ค.
2.
Elasticsearch๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ ์ค ํ๋๋ ์ญ์์ธํ๋ผ๋ ๊ฐ๋
์
๋๋ค. ์ญ์์ธํ๋๋ ๋จ์ด๊ฐ ์ด๋ ๋ฌธ์์ ๋ํ๋๋์ง๋ฅผ ๊ธฐ๋กํด ๋์ด ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
3.
Elasticsearch๋ ๋ถ์ฐ ์์คํ
์ผ๋ก ์ค๊ณ๋ผ ์์ด์ ์ฌ๋ฌ ๋
ธ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ์ ์ฅํ๊ณ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ๋ถ์ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
4.
Elasticsearch๋ ์ค์๊ฐ ๊ฒ์์ ์ง์ํ๊ณ ์์ด์ ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋๋๋ผ๋ ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋๊ท๋ชจ์ ๋ฐ์ดํฐ์
์์๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๋ฐ ๊ธฐ์ฌํ๊ณ ์์ต๋๋ค.
์๋ผ์คํฑ ์์น์ ๊ฒ์์ด ๋น ๋ฅธ ์ด์ ?
Elasticsearch๋ Lucene ์ธ๋ฑ์ค ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ์ ์์ง์
๋๋ค.

Lucene์ Apache ์ํํธ์จ์ด ์ฌ๋จ์์ ๊ฐ๋ฐํ ํ
์คํธ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ญ์์ธํ๋ฅผ ํฌํจํ ๋ค์ํ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ผ์คํฑ ์์น๋ Lucene์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ Lucene์ ๊ฐ๋ ฅํ ์ญ์์ธํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ, ์๋ผ์คํฑ ์์น๋ ์ฌ์ฉ์์๊ฒ ๋ ํธ๋ฆฌํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉด์ Lucene์ ๊ฐ๋ ฅํ ๊ฒ์ ์์ง์ ๋ด๋ถ์ ์ผ๋ก ํ์ฉํ๊ณ ์์ด.
Lucene ์ ํน์ง?
Lucene์ ํ
์คํธ๋ฅผ ๋จ์ด ๋๋ ํ ํฐ ๋จ์๋ก ๋ถ์ํ์ฌ ์์ธํํฉ๋๋ค.
[Spring][258] Elasticsearch์ Lucene ์ธ๋ฑ์ฑ
์ง๋ฌธ์ด ๋์ฌ๋งํ ๋ถ๋ถ์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ํคํ
์ฒ ๊ธฐ์ ๋์
๋ฐฐ๊ฒฝ๋ถํฐ ์์๋๋ค.
์ ์ฒด์ ์ธ ์์ฒญ์ ํ๋ฆ?
์ ์ฒด์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ์ด ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง ์๋ ค์ฃผ์ธ์.
โข
๊ธฐ๋ณธ ํ๋ฆ
โฆ
ํด๋ผ์ด์ธํธโAJAX์์ฒญโ๋ก๋๋ฐธ๋ฐ์โ์ํ๋ฆฌํฐํํฐ์ฒด์ธโ๋์คํจ์ฒ์๋ธ๋ฆฟโ(์ปจํธ๋กค๋ฌโ์๋น์คโ๋ฆฌํฌ์งํ ๋ฆฌ)โ๋ฐ์ดํฐ๋ฒ ์ด์ค
โช
๋ก๋๋ฐธ๋ฐ์์์๋ HTTP๋ HTTPS๋ก ๋ฆฌ๋๋ ์
ํจ
โข
ROUTE53
โข
ACM์์ SSL ์ธ์ฆ์
๊ทธ ํ๋ฆ์์ ์นดํ์นด๋ ์ด๋ค ์ญํ ์ ํ๋์?
โข
๊ธฐ๋ณธ์ ์ผ๋ก ์ ํฌ๋ ๋ฉ์ธ์๋ฒ์, ์ด๋ฒคํธ๋ง์ ์ํ ๋
๋ฆฝ์ ์ธ ์๋ฒ๊ฐ ๋ณ๋๋ก ์กด์ฌํฉ๋๋ค.
โข
์๋ฒ๊ฐ ๋๋์ด์ก๊ณ ๊ทธ ์ค๊ฐ ์ญํ ๋ก ์นดํ์นด๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ญํ ์
๋๋ค.(๋ฉ์์งํ)
์๋๋ ์ฐ๊ฒฐ๋๋ ์ง๋ฌธ๋๋ ๋ต๋ณ์
๋๋ค.
๋๊ฐ๋ฅผ ๋๋์ด์ ?
๋ฉ์ธ์๋ฒ์์ ๋ถํ๊ฐ ๋ง์ด ์๊ฒผ์๋, ์๋ฒ๋ฅผ ํ์ฅํด์ผ ํ ๋ ๊ธฐ์กด์ ๋ชจ๋๋ก์ ๊ตฌ์กฐ์์๋ ๋ชจ๋ ์๋น์ค๊ฐ ํ์ฅ๋์ด์ผํ์ง๋ง,
์ด ๊ตฌ์กฐ๋ฅผ ํตํด์ ์ด๋ฒคํธ ์๋ฒ๋ง ๋
๋ฆฝ์ ์ผ๋ก ํ์ฅ ํ ์ ์์ต๋๋ค.
๊ทธ ํ๋ฆ์์ ๋ ๋์ค๋ ์ด๋ค ์ญํ ์ ํ๋์?
๋ ๋์ค๋ ๋ ๋์ค ๋ถ์ฐ๋ฝ์ ์ํด์ ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
์ ํํ ์ด์ ๋ ๋ถ์ฐ DB์ ํ์ฅ์ ์ํด์ ์ ํํ์ต๋๋ค.
์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์ํ๋์ง?
์ฃผํคํผ์ ๋น๊ตํ๋๋ฐ, ์ ํฌ๋ ์ค์๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฉ๋ชจ๋ฆฌ๋ฐฉ์์ธ ๋ ๋์ค๊ฐ ๊ฐ์ฅ ์ ํฉํ์ต๋๋ค.
๋์์ฑ ์ ์ด๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
ํธ๋์ญ์
, ๊ฐฑ์ ์คํจ, ๋ฐ๋๋ฝ
๊ฒ์ ์ฑ๋ฅ์ ๊ฐ์ ์ํฌ์ ์๋ ๋ค๋ฅธ๋ฐฉ์? ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ๋ ๊ด๋ จ์๋๊ฒ?
ํ๋ฒ ํด๋ณธ๊ฒ , ์ํด๋ณธ๊ฒ
[Spring][258]
ย ์์ ์ง์ ์๋ต ๋ชฉ๋ก - ํ๋ก์ ํธ์ ๋ํ์ฌ ๋ฐํํ๋ฆ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
JPQL ์ฟผ๋ฆฌ๋ก ์ง์ ๊ฒ์ ๋ฐฉ์ ์ ํ๊ธฐ
์๋ ์ฟผ๋ฆฌ๋ฅผ @Query ์ด๋
ธํ
์ด์
์ ํตํด์ ์์ฑํ์ฌ ๊ฒ์์ ๋ฐฉ์์ ๋ณ๊ฒฝ ํ ์ ์๋ค. ๊ธฐ์กด ์ง์ ๋ด๋ถ ๋ก์ง์ ๊ตฌ์ฑํ๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ, ๋ง์น JPQL์ ์ฌ์ฉํ๋๊ฒ ์ฒ๋ผ ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑ ํ ์ ์๋ค. ๊ทธ๋ผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋ฆฌ๋ฌธ์ด ์ปดํ์ผ ๋จ๊ณ์์ ๊ฒ์ฌ๋์ง ์๋ ๋จ์ ์ด ์์ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
QueryDSL๋ก ๊ตฌํํด๋ณด๊ธฐ
build.gradle ์์กด์ฑ ์ถ๊ฐ
QueryDSL ํ๋ฌ๊ทธ์ธ ๋ฐ ํ์คํฌ ์ค์
ElasticBookRepository๋ฅผ ์์๋ฐ์ ElasticBookSearchRepositoryImpl.java ๊ตฌํ์ฒด์์ ๋ค์์ฒ๋ผ ๊ตฌํํ๋ค. Q๊ฐ์ฒด๋ฅผ ํตํด์ ์ฟผ๋ฆฌํฉํ ๋ฆฌ๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ๋ฉ์๋ํํ๋ก ์์ฑํ๊ฒ ๋๋ค. ์ด๋ฌ๋ฉด ์ปดํ์ผ ๋จ๊ณ์์ ๊ฐ๋ฐ์์ ์ค๋ฅ๋ฅผ ์ฐพ์ ์ ์๋ค.
์๋๋ JPQL๋ก ์ง์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ผ ๋์ ๊ฐ ๊ฒ์ API์ด๋ค.
1. ๊ฒ์API Template
2. ๊ฒ์ ํ๋ผ๋ฉํฐ
[Spring][258] Elasticsearch APIs
[2:22] ELB ์ค๋ช
ํ์ค ๋ https๋ฅผ ์ธ๊ธํ์
จ๋๋ฐ, ๋ฐํ์๋ฃ์๋ ๊ทธ ๋ด์ฉ์ด ๋ฐ์๋์ด ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ main server์ event server์ spring architecture๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ค ํ์๋ ์๊ณ , application server๋ก ์ ์ํ ๋ค์ ํด๋น server์ ์คํ์ ํ๋๋ง ๋ณด์ฌ์ฃผ๊ณ main server์ event server๊ฐ application server ๊ตฌ์กฐ๋ก ๋์ด์๋ค๊ณ ๋ณด์ฌ์ฃผ๋ฉด ๋ ๊น๋ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐํ์๋ฃ ์์ 
๋๋ณธ ์์ 
์์ ๋ฉํธ ์์ 
[2:58] mysql DB๋ก ๋ถํฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋๋ค๋ ํํ๋ณด๋ค๋, logstash๊ฐ ์ ์ฒ๋ฆฌํ ๋์ ๋ฐ์ดํฐ๊ฐ elasticsearch์ ์ ์ฅ๋๊ณ , ์ด ๋ฐ์ดํฐ๊ฐ mysql์ ๋๊ธฐํ๋๊ณ ์๋ค๋ผ๊ณ ํํํ๋๊ฒ ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐํ์๋ฃ ์์ ์์
๋๋ณธ ์์ 
์์ ๋ฉํธ ์์ 
[3:15] ELK stack์ ๋ํ ์ด์ผ๊ธฐ๋ ์ด๋ฏธ ์์์ ๊ฐ์ด ๊ตฌ์ถ๋์ด ์๋ค๋ ๋ด์ฉ์ผ๋ก๋ ์ถฉ๋ถํ๋ฏ๋ก ๊ตณ์ด ์ํ์
๋ ๋ฉ๋๋ค. ์คํ๋ ค ์คํ์ ๊ตฌ์ฑํ๋ ๊ฐ ์์(elasticsearch, logstash, kibana)์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค๋ช
ํด์ฃผ์๋๊ฒ ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐํ์๋ฃ ์์ ์์
๋๋ณธ ์์
ELK์ค๋ช
์ 10์ด๋๋๋๊น ์ฐ์ ์ ์ฒด ์์ ํ๊ณ ๋จ๋์๊ฐ๋ณด๊ณ ํ์
ELK Stack์ ๋ฐ์ดํฐ๋ฅผ ์์ธํํ๊ณ ์ ์ฅํ๋ ElasticSearch์, ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ ๊ฐ๊ณตํ๋ Logstash, ๋ง์ง๋ง์ผ๋ก ์ด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์๊ฐํํ๋ Kibana๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์์ ๋ฉํธ ์์ 
[Spring][258] ๋ฐํ ํผ๋๋ฐฑ ์์ [์๋ฃ]
Spring Boot
Spring Security
JWT
Swagger
Spring Data JPA
Querydsl
GitHub Actions
Elasticsearch
MySQL
Kafka
Redis
AWS ์ธํ๋ผ
[Spring][258]
ย ์์ ์ง์ ์๋ต ๋ชฉ๋ก - ๊ธฐ์ ์คํ๊ณผ ๊ด๋ จ๋ ๊ฒ๋ค
1. ๊ฒ์ ๊ธฐ๋ฅ ์ ๊ทธ๋ ์ด๋

โข
๊ธฐ์กด ํ์ด์ง ๋ฒ์ (v3)
โข
์ฌ๋ผ์ด์ค ๋ฐฉ์์ ๋ฒ์ (v4)
โข
๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ(is1)
[Spring][258] ํ๋ก์ ํธ ๋ง๋ฌด๋ฆฌ ์์
์ธ์ฉ
โข
๊ฐ๋จ์๊ฐ์์๊ณผ ๋ฐํ์๋ฃ ๋ฐํ์์ ์ต์ข
๋ณธ์ ์ถ
โฆ
ํธ์ง์์
โฆ
๋๋ณธ์ฒดํฌ
โฆ
์ ๋ฐํ๋ฆ์ดํด๋ฅผ ์ํด ๊ฐ์์๊ฒ ์ง๋ฌธ์ ์์ฃผํ ์์์ต๋๋ค.
โฆ
์ ์ถ์ด ๊ฐ์ฅ ์ค์ํ๋ ์ฒ๋ฆฌ ํ ์ง๋ต๋ถ๋ถ์ ํฌ์
ํ ๊ฒ์
๋๋ค.
โข
์ฃผ๋ง์์
โฆ
๊ฐ๋จ์๊ฐ ์ ์ฒด ์ฝํฐ๋ฅผ๋ฐ๋ผ ๋
นํ์ ์ํ ๋ชจ๋ ์์
์๋ฃ๋์์ต๋๋ค
โฆ
ํผํฐ ์ ์ฒด ํ
๋ง๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ๊ฐ๋จ์๊ฐ์์์ฉ ํผํฐ๊ธฐ์ค์ผ๋ก ๊ธฐ์กดํผํฐ๊ฐ ๋ฐํ์ฉ์ผ๋ก ์ด์๋ ์์ ์
๋๋ค.
โฆ
์์์ผ ๋ฐํ ํผ๋๋ฐฑ์ด ๋์ฐฉํ๋ฉด ์ถ๊ฐ์ ์ธ ๊ฐ์ธ๋ถ๋ถ๋ค์ ๋ํ ์ง๋ฌธ ๋๋ ์ฌ์ํ ๋ณ๊ฒฝ ๋ฑ ์์ฒญ์ด์์์์์ต๋๋ค.
๊ฐ์ฉ์์ต์ ํ
โข
์ง์์๋ต ์๊ฒฌ๊ฒฐ์ ๊ด๋ จ๋ด์ฉ ๋ชจ๋์ ๋ฆฌ
โฆ
์ง๋ฌธ์ด๋ ๊ผฌ๋ฆฌ์ง๋ฌธ์ด ๋์ฌ๋งํ ๊ฒ๋ค์ ๋ํด์ ์ฌ์ ์ฒ๋ผ ๊ผผ๊ผผํ ์ ๋ฆฌํด์ผํฉ๋๋ค
โช
๊ธด ๋ง๋ณด๋ค๋ ๊ฐ๊ฒฐํ๊ฒ ํต์ฌ๋ง ํ๋๋ฌธ์ฅ์ผ๋ก โ์ค์ ๋ณธ์ธ์ด ๋๋ตํ๋คโ ๋ผ๋ ์๊ฐ์ ํ๊ณ ์ฝ์ด๋ณด๋ฉด์ ์์ฑํด๋ก๋๋ค.
โฆ
๋ธ๋ก์
๊ธฐ์ ์ ํ๊ทผ๊ฑฐ ๋ถ๋ถ ์ฐธ๊ณ
โฆ
๊ผฌ๋ฆฌ์ง๋ฌธ
โฆ
ํ๋ก์ ํธ์ ๋ํด ์ค์ค๋ก ๋ณด๊ณ ์ง๋ฌธ์ด ๋ฌด์์ด ๋์ฌ์ง ์๊ฐํด๋ณด๊ธฐ
โข
API ๋ช
์ธ์ ํ ์ ๋ฆฌ, ์ค์จ๊ฑฐ๋ ๊ฒฐ๊ณผ์ธ ๊ฒ์ด๋ฏ๋ก ํ์๋ ๋ค๋ฅด๋ค. ์ด๊ฒ์ ๋ฏธ๋ฃจ์๋ ์ผ์ผ๋ฟ.
โฆ
์ค์จ๊ฑฐ๋ก ๋์ฒดํ๋๊ฑด ์ฐ์ ์์์์ ๋ฏธ๋ค๋๊ฒ์ด์ง
โฆ
์ค์ ๋ก api๋ช
์ธ์๊ฐ ์์ด์ผํฉ๋๋ค. ์ ํฌ๋ ํ๋ก์ ํธ ์ฃผ์ ๋ณ๊ฒฝํ ๋น ๋ฅด๊ฒ ๊ตฌํํ๋๋ผ ์ด๋ถ๋ถ์ ์ถ๊ฐ์์ ํ๋๊ฒ์ด ๋ฏธ๋ค์ก์ต๋๋ค.
โฆ
๋ณธ์ธ๋ถ๋ถ๋ง ์ฒ๋ฆฌํ์ง๋ง๊ณ ๋ชจ๋ ๋ถ๋ถ์ ์ฒดํฌํด์ฃผ์ธ์.
โฆ
456์ฃผ์ฐจ ์คํฌ๋ผ, ๋ฉํ ๋ง ๋ฑ ๋ฌธ์ํ๋ถ๋ถ ์ฌํ์ธํ์,
โช
๋ง๋ฐ์ง์ ๋ฐํ์ค๋น์ ์ ๊ฐ์์ฑ์ ๋ง๋ฌด๋ฆฌํ์ง๋ชปํ ๋ถ๋ถ์ด ์์๊ฒ์
๋๋ค
โช
ํนํ ๋ฉํ ๋ง ์งํ์ ์ฐ๋ฆฌ๋ ์ฌ์ ๋
ธํธ์ ์ ๋ฆฌํ๊ฒฝ์ฐ๊ฐ๋ง์์ ์ ํฌ ๋ธ๋ก๊ทธ์ ๋ฉํ ๋ง ํ๊ทธ์ ๋ฉํ ๋ง๋ด์ฉ์ ๋ฆฌ ๋ถ๋ถ์ ์ฎ๊ฒจ์ฃผ์ธ์
โช
ํด๋น ๋ถ๋ถ๋ค ํ์ธํ๊ณ ์ ์ฒด์ ์ธ SA ๋ฏธํก๋ถ๋ถ ์ฒดํฌ, ๋ณด์ ํ์ํฉ๋๋ค
โช
๋ฌธ์ํ ํผ์ํ๊ธฐ ์๊ฐ์ด๋ถ์กฑํฉ๋๋ค ๋์์ฃผ์ธ์
์ ํ(์ฃผ๋ง์์
ํ์ฅ ํ์ธ์๋ฃ)
ํ๋ก ํธ์๋ ๋ถ๋ถ ์ถ๊ฐ ์์ ํ์์ฌํญ
โข
ํ๋ก ํธ์๋ ๋ฉ์ธํ์ด์ง๋ฅผ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์์ํ๊ณ ๋ก๊ทธ์ธ ์ดํ ๋์ ๊ฒ์ ํ์ด์ง๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ด๋ํ๋๋ก ๊ตฌ์ฑ
โข
ํ๋ก ํธ์๋ ๊ฒ์๋ถ๋ถ์ ๋๋กญ๋ค์ด์ผ๋ก ๋จ๊ณ์ ๊ตฌ์ฑ ํ์ํ๊ฐ? ์๋๋ฉด ์ต์ข
๋ณธ๋ง ์ฐ๊ฒฐํ ๊น
โฆ
Search
โช
๊ธฐ์กดํ์ด์ง v3
โช
์ฌ๋ผ์ด์ค v4
โช
๋ฌดํ์คํฌ๋กค is1
โช
์๋ผ์คํฑ el1
โข
ํ๋ก ํธ์๋ ๋ค๋น๊ฒ์ด์
์ ๋ณํํ์
โฆ
๋ก๊ทธ์ธ ์ํ์ ๋ํ ํํ
โช
๋น๋ก๊ทธ์ธ ์ํ
โข
๋ก๊ทธ์ธ ๋ฉ๋ด๊ฐ ๋ณด์ฌ์ผํจ
โข
๋ก๊ทธ์์์ด ์๋ณด์ฌ์ผํจ
โช
๋ก๊ทธ์ธ ์ํ
โข
๋ก๊ทธ์ธ ๋ฉ๋ด๊ฐ ์๋ณด์ฌ์ผํจ
โข
๋ก๊ทธ์์ ๋ฉ๋ด๊ฐ ๋ณด์ฌ์ผํจ
โฆ
๋ก๊ทธ์ธ ์ ์ ์ ๋กค์ ๋ฐ๋ผ ๋ณด์ด๋ ๋ฉ๋ด๊ฐ ๋ฌ๋ผ์ผ ํ๋ค
โช
์ ์ ์ธ ๊ฒฝ์ฐ(๊ด๋ฆฌ์๋ฉ๋ด๋นผ๊ณ )
โข
๋์๊ฒ์๊ฐ๋ฅ
โข
๋์๋๋์ ์ฒญ
โข
๋ง์ดํ์ด์ง
โช
๊ด๋ฆฌ์์ธ๊ฒฝ์ฐ
โข
๊ด๋ฆฌ์๋ฉ๋ด๋ค
[Spring][258] [์ค์๊ณต์ง] ํ๋ก์ ํธ ๋ง๋ฌด๋ฆฌ๋จ๊ณ ํ์ฌ ํ์ํ ์์
์
๋ฌด๋ถ๋ด์
๋๋ค.[์๋ฃ]
Q. ๊ฒ์ ์ฑ๋ฅ์ด ์ ์ง์ ์ผ๋ก ๊ฐ์ ๋์ง ์๊ณ ํ๋ฒ์ ์ฌ๋์ต๋๋ค.
A. ์ ์ง์ ์ผ๋ก ๊ฐ์ ๋๊ฑฐ๋ ๊ทธ๋ฐ ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ํ๊ฒ ์ง๋ง, ๊ทธ๋ ์ง ์์ ์๋ ์์ต๋๋ค. ์ค์ ๋ก ๊ทธ๋ ๊ธฐ๋ํฉ๋๋ค. ์คํ๋ ค ์ฑ๋ฅ์ด ๋์ ๋๋ ์์ต๋๋ค. ํ์ง๋ง ์ค์ํ๊ฑด ๊ทธ ํ
์คํธ ์๋ฃ๋ค์ ๊ทธ๋ ๋ค๊ณ ํด์ ํ์ ์๋๊ฒ์ด ์๋๋๋ค. ์คํ๋ ค ๊ทธ๋ฐ ๋ชจ์ต์ ์ฐ์ถํ๋ ค๊ณ ์กฐ์๋๋ฉด์๋๊ณ ๊ทธ๋๋ก ๋ํ๋๋๊ฒ์ด ๋ง์ต๋๋ค. ๊ทธ๋์ ์ง๊ธ ๊ฒฐ๊ณผ๊ฐ ๋ง๋๊ฒ์
๋๋ค.
Q. ํฅํ ํ๋ก์ ํธ์์ ์ด๋ค ๋ถ๋ถ์ ์ค์ ์ผ๋ก ์งํํ๋ฉด ์ข์ ๊น์?
A. FTI์ Elasticsearch๋ฅผ ๋์
ํ ๋ถ๋ถ์์ ํํ
์คํธ์ธ๋ฑ์ค์ ํธ์ฐจ๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์ ๋ ๊น๊ฒ ํ๋ณด์์ผ๋ฉด ์ข์์๊ฒ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ํ๋ก์ ํธ ๋๋๊ณ ๋ ๊ณ์ํด์ ์ฐพ์๋ณผ ํ์๊ฐ ์์ต๋๋ค.
MySQL์ ํํ
์ธ๋ฑ์ค์ ๋ํด์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์๋ฃ๊ตฌ์กฐ๊น์ง ํ์ฅํด๋ณด๊ณ ๋ํด์ ๋ํดํธ ์์ง์ธ InnoDB์ ๋ํด์๊น์ง ๊ทธ ์ฐจ์ด๋ฅผ ๋ฐ์์ํค๋๊ฒ์ด ๋ฌด์์ธ์ง ์์๋ณด๊ธฐ๊น์ง..
๊ทธ ํธ์ฐจ์ ์์ธ, ๋ฌด์์ด ๊ทธ๋ ๊ฒ ๋ง๋ค์๋์ง ์ฐพ์๊ฐ๋ ๊ณผ์ ์ ๊ณ์ํด์ ๊ณต๋ถํด๋ณด์๋๊ฒ ๋์ ๋ ์ ์์ต๋๋ค. ๊ทธ๊ฒ ๊ทธ ๋ถ๋ถ์ ๋ํด์ ๋ค๋ฅธ ์ด๋ ๊ฐ๋ฐ์๋ณด๋ค ์ ์๋, ์ ์ด๋ฐ ํ์์ด ๋ํ๋๋์ง ์๋ ๊ฐ๋ฐ์๊ฐ ๋๋ ๊น์ ๊ณต๋ถ ๋ฐฉ๋ฒ์
๋๋ค.
ํนํ ์ด๋ฐ ๊น์ ๊ณต๋ถ๋ฅผ ํ ๋๋ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๊ฐ์ฅ ๋ช
ํํ ๊ทผ๊ฑฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฉํ ๋์ ์ถฉ๊ณ
๊ณตํต์ ์ผ๋ก ๊ธฐ์ ์คํ๋ค์ ๋ํด์ ๊ทผ๊ฑฐ๋ฅผ ์ ์ ๋ฆฌํด์ค๊ณ ์์ง๋ง ๋ํ ๊ณ์ํด์ ๋ณด๋ค ๋ ์ ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ ์ด์ ๋ ์ด๋ ๊ณง ๊ธฐ์ ์ ์ ํ ๋๋ ํ๋จํ๋ ๋ฅ๋ ฅ์ด๊ณ , ๊ทธ ๊ธฐ์ ์ ์ ํํ ๊ฒ์ด ๋ง๋ค๋ ๊ทผ๊ฑฐ๋ฅผ ๋ง๋๋ ๋ฅ๋ ฅ. ์ด๊ฒ ์ค๋ฌด์์ ์ค์ ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ๋ก์ ํธ ๋์ ์์ฃผํ๋ฉด ์๋ฉ๋๋ค. ๊ฐ๋ฐ๊ณต๋ถ ์์์
๋๋ค.
๋ง๋ฌด๋ฆฌ ๋ ์ ์๋ ๋ถ๋ถ์ ๋ง๋ฌด๋ฆฌํด์ผ๊ฒ ์ง๋ง, ์์ผ๋ก ๋ํด์ผํ ๊ฒ์ด ๋ง๊ณ ,
์คํธ๋ ์ค ๊ด๋ฆฌ์ ๋ฒ์์์ ์กฐ์ ํด์ผ ํฉ๋๋ค.
[Spring][258] [5์ฃผ์ฐจ ๋ฉํ ๋ง] ์ง๋ฌธ๋ด์ฉ ์ ๋ฆฌ์ ๋ต๋ณ + ์กฐ์ธ
๊ธฐํ
์ด ์์์ ๋ฐํ์์์ด์๋๋ค. ์๊ฐ์์์ด๋ผ ์๊ฐํด์ผํ๋ค.

๋ฐํ์์๋ณด๋ค ๊น๋ค๋กญ๋ค. ์ฐ์ถ์ด ํ์ํ๋ค.
์ ํ ์๊ฐ 2๋ถ
์ด ๊ฐ๋จํ ์์์ ์ฐ์ถํด์ผํ๋ค.
ํต์ฌ์ ์ธ ๋ด์ฉ ๋ฑ 2๊ฐ๋ฅผ ์ค๋ช
ํด๋ด์ผ ํ๋ค.
์๋น์ค๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด์ ํต์ฌ๊ธฐ์ ์ ํํํด์ผํ๋ค.
[Spring][258] ๊ฐ๋จ์๊ฐ ์์ ๊ตฌ์[์๋ฃ]
๋ฐํ์๋ฃ์ ๊ตฌ์ฑ
์ฒซํ๋ฉด
๋ชฉ์ฐจ
๊ธฐํ๋ฐฐ๊ฒฝ
๋ชฉํ
์์ฐ์์
์ํคํ
์ฒ์ค๋ช
+ ๊ธฐ์ ๋์
๋ฐฐ๊ฒฝ
ํธ๋ฌ๋ธ์ํ
์ฑ๋ฅ๊ฐ์ ์ฌํญ
์ข
๋ฃํ๋ฉด
๋ฐํ์๋ฃ์ ์์์ ํ์ฉ
์์์ ํผํฐ ํ๋ฆ์ ์ ์ ํ ๋ด์ฉ๋ค์ ๊ฐ๊ฒฐํ๊ณ ์ถฉ๋ถํ๊ฒ ์ค๋ช
๋๋๋ก ๊ตฌ์ฑ
์ฝํฌ๋ ๊ธฐ๋ณธ
ํผํฐ ๋์์ธ ์ฝํฐ


ํ๋ฆฌ๋ฏธ์ด๋ฅผ ํ์ฉํ ํธ์ง
์์ง๋ฅผ ์ต์ํํด์ผํ๋ค ์๊ฐ์ ์ธ์ด๋ธ๊ฐ ํ์ํ๋ค
[Spring][258] ๋ฐํ ์์&PPT ๊ตฌ์ฑ[์๋ฃ]
ํ๋ก์ ํธ ๊ธฐํ ๋ฐฐ๊ฒฝ ์ค๋ช (30์ด)
โข
ํด๋น ํ๋ก์ ํธ๋ฅผ ์ด๋ ํ ๋ฐฐ๊ฒฝ๊ณผ ๋น์์ฑ์ผ๋ก ๊ธฐํํ๊ฒ ๋์๋์ง ์ค๋ช
ํด์ฃผ์ธ์.
โข
โํ์ค์์ ์ด๋ ํ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ฌ ์ด๋ค ๊ธฐ์ ์ ํ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ์๋ค.โ
์์ฐ ์์ ์ฌ์ (1๋ถ)
โข
์๋น์ค์ ํต์ฌ์ด ๋๋ ๊ธฐ๋ฅ๋ง ์์ฐํด ์ฃผ์ธ์. ์ฆ, ํ์๊ฐ์
, ๋ก๊ทธ์ธ ๊ณผ์ ๋ฑ์ ์๋ตํด๋ ๋ฉ๋๋ค.
โข
์๋น์ค ์์ฐ์๋ ๋ณ์๊ฐ ๋ง์ต๋๋ค. ๊ฐ๋ฅํ ๋
นํ ์์์ ํ์ฉํ์ฌ ๋ฐํ๋ฅผ ์งํํด์ฃผ์ธ์.
์ํคํ ์ฒ ์ค๋ช ๋ฐ ๊ธฐ์ ๋์ ๋ฐฐ๊ฒฝ (2๋ถ)
โข
์๋น์ค๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋์ง, ์ฃผ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ค ๊ธฐ์ ์ ์ผ๋์ง ์ค๋ช
ํ๋ ์๊ฐ์
๋๋ค.
โข
์ํคํ
์ณ ๋ฐ ๋์
ํ ๊ธฐ์ ์ ์ค๋ช
ํ์ค ๋๋ ๋ฐ๋์ ์์ฌ๊ฒฐ์ ๊ณผ์ ์ ์ค๋ช
ํด ์ฃผ์ธ์.
์คํ๋ง๋ถํธ- MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ต๋๋ค. DB๋ AWS RDS ํ๊ฒฝ์ผ๋ก ๊ตฌ์ถ๋์ด ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์นดํ์นด ๋ ๋์ค๋ ๋์์ฑ ์ ์ด๋ฅผ ์ํ์ฌ ์์ต๋๋ค.
์๋ผ์คํฑ์์น๋ ๊ฒ์ ์์ง ๊ธฐ๋ฅ ์ญํ ์ ์ํด ๋ณ๋ EC2 ์๋ฒ์ Logstash์ KIbana์ ํจ๊ป ๊ตฌ์ถ๋์ด ์์ต๋๋ค. MySQL๋ก๋ถํฐ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํ ํ๊ณ ์์ต๋๋ค.
[Spring][258] ๋ฐํ ๋๋ณธ ํ๋ฆ ๊ตฌ์[์๋ฃ]
์ด์
์ ํฌ ํ๋ก์ ํธ์ CI/CD์ ์ํํธ์จ์ด ์ํคํ
์ฒ๋ฅผ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํฌ์กฐ๋ CI/CD๋ฅผ Github Action๊ณผ AWS์ S3, Codedeploy๋ฅผ ์ด์ฉํด์ ๊ตฌํํ์์ต๋๋ค.
์ ํฌ GitHub์์ main ๋ธ๋์น๋ก pull request๋ฅผ ๋ณด๋ด๋ฉด GitHub Action์ ์ด์ฉํด์ AWS์ S3์ Codedeploy๋ฅผ ํตํด AWS EC2 ์๋ฒ๋ก ๋ฐฐํฌ๋๋ ๊ตฌ์กฐ์
๋๋ค.
๊ทธ๋ผ ์ด์ ์ ํฌ๊ฐ ์ GIthub Action์ผ๋ก CI/CD๋ฅผ ๊ตฌ์ฑํ์๋์ง ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํฌ๋ ์ด๊ธฐ Jenkins์ GitHub Action ์ฌ์ด์์ ๊ณ ๋ฏผ์ ํ์์ต๋๋ค.
Jenkins๋ ๋ณ๋์ ์๋ฒ๋ฅผ ์ค๋นํ๊ณ ์ ์ง๋ณด์ํด์ผ ํ๋ ๋น์ฉ๊ณผ ๋
ธ๋ ฅ์ด ํ์ํ๋ฉฐ, AWS CI/CD์ ํนํ๋ ๋๊ตฌ๋ค๊ณผ์ ํตํฉ์ ์ํด ์ถ๊ฐ์ ์ธ ํ๋ฌ๊ทธ์ธ์ด๋ ์ค์ ์ด ์๊ตฌ๋ฉ๋๋ค.
Jenkins๊ฐ ๊ฐ๋ ฅํ ์ปค์คํฐ๋ง์ด์ง์ ์ ๊ณตํ์ง๋ง, GitHub Actions๋ AWS์์ ํตํฉ ๋ฐ ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ ๊ฐํธํ๊ณ ํจ์จ์ ์ธ ์๋ฃจ์
์ ์ ๊ณตํฉ๋๋ค.
๋ํ GitHub Action์ ์ฌ์ฉํ๋ฉด GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๊ธด๋ฐํ ํตํฉ์ผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํฌํ๋ก๋ฅผ ์ฝ๊ฒ ์ค์ ํ ์ ์๊ณ ์ฝ๋ ์์ค์ CI/CD ํ์ดํ๋ผ์ธ์ด ๋์ผํ ์ฅ์์์ ๊ด๋ฆฌ๋๋ฏ๋ก ๊ฐ๋ฐ์๋ ๋ณ๋์ CI ๋๊ตฌ๋ก ์ ํํ ํ์ ์์ด ํธ๋ฆฌํ๊ฒ ์์
ํ ์ ์๊ธฐ์ ์ ํํ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ์ ํฌ ์ํํธ์จ์ด ์ํคํ
์ฒ์ ๋ํ์ฌ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ํ ์ ์ฐ์ ELB ( ALB )์์ ํด๋ผ์ด์ธํธ๊ฐ https ํ๋กํ ์ฝ์ ์ฌ์ฉ ํ๋์ง ์ดํด๋ณด๊ณ http๋ฉด https ํต์ ์ ํ๋๋ก ์ํ์ฝ๋ 301์ ํตํด ๋ฆฌ๋๋ ์
์ ํฉ๋๋ค. ํด๋ผ์ด์ธํธ๊ฐ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด Main Server๋ก ์ ๋ฌํด ์ค๋๋ค. ์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฟ์ด๋ฉด ์์ฒญ์ ๋๋์ด์ ํ ์๋ฒ์์ ๋ชจ๋ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ์๊ฒ ๋ถ๋ฐฐํด์ค๋๋ค. ๊ทธ ํ Main ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ์๋น์ค๊ฐ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ ์ฑ
๋๋ ์๋น์ค์ธ์ง ์ฌ๋ถ๋ฅผ ํ์
ํฉ๋๋ค. ์ฑ
๋๋ ์๋น์ค๋ ์งง์ ์๊ฐ ๋๊ท๋ชจ์ ํธ๋ํฝ์ด ์์๋๋ ์๋น์ค์ด๊ธฐ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ์์ต๋๋ค. ๋ง์ฝ ์ฑ
๋๋ ์๋น์ค๊ฐ ์๋๋ผ๋ฉด ๋ฉ์ธ์๋ฒ์์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ
๋๋ ์๋น์ค์ธ ๊ฒฝ์ฐ์๋ ํ๋ก๋์๋ฅผ ํตํด ์นดํ์นด๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ์ด๋ฒคํธ ์๋ฒ์์๋ ์ปจ์๋จธ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ดํ ๋ ๋์ค์ ๋ถ์ฐ๋ฝ์ ํตํด ๋์์ฑ ์ ์ด๋ฅผ ํ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํ๋ก๋์๋ฅผ ํตํด ์นดํ์นด ์๋ฒ๋ก ๋ณด๋
๋๋ค. ๋ฉ์ธ์๋น์ค์์๋ ์ปจ์๋จธ๋ฅผ ํตํด ๋ณด๋ธ ์์ฒญ์ ํด๋นํ๋ ์ด๋ฒคํธ ์๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํด์ค๋๋ค.
1์ฐจ ์์ ๋ฐ ์ ๋ฆฌ
ํ๋ก์ ํธ์ CI/CD ๋ฐ ์ํํธ์จ์ด ์ํคํ
์ฒ์ ๋ํด ์๋ดํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ ํฌ ํ์ Github Action, AWS์ S3, ๊ทธ๋ฆฌ๊ณ Codedeploy๋ฅผ ํ์ฉํ์ฌ CI/CD๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค.
์ด๋ฅผ ํตํด, Github์ main ๋ธ๋์น๋ก pull request๊ฐ ์ด๋ฃจ์ด์ง๋ฉด ์๋์ผ๋ก AWS EC2 ์๋ฒ๋ก ์ฝ๋๊ฐ ๋ฐฐํฌ๋๋ ์์คํ
์ ๊ฐ์ถ์์ต๋๋ค.
CI/CD ์์คํ
์ ํ์ ์์ด, ์ ํฌ๋ Jenkins์ GitHub Action ์ค ๊ณ ๋ฏผ ๋์ ํ์๋ฅผ ์ ํํ์ต๋๋ค. Jenkins๋ ๊ฐ๋ ฅํ ๋ง์ถค ์ค์ ์ด ๊ฐ๋ฅํ์ง๋ง ๋ณ๋์ ์๋ฒ ์ ์ง ๋ฐ AWS์์ ํตํฉ์ ์ํ ์ถ๊ฐ ์์
์ด ํ์ํ ๋ฐ๋ฉด, GitHub Action์ AWS์์ ํตํฉ์ด ์ฉ์ดํ๊ณ ๊ด๋ฆฌ๊ฐ ๋ ๊ฐ๋จํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ ์ฝ๊ฒ ์์
ํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ค์์ผ๋ก ์ ํฌ ์ํํธ์จ์ด ์ํคํ
์ฒ๋ฅผ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ELB(ALB)๊ฐ ์ด๋ฅผ ๋ฐ์์ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋์ง ํ์ธํ๊ณ , ํ์ํ ๊ฒฝ์ฐ HTTPS๋ก ๋ฆฌ๋๋ ์
ํฉ๋๋ค.
์์ ํ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ฒญ์ ๋ฉ์ธ ์๋ฒ๋ก ์ ๋ฌ๋๋ฉฐ, ์ด ์๋ฒ๋ ์์ฒญ์ ์ ์ ํ ๋ถ์ฐํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
ํนํ ๋๊ท๋ชจ ํธ๋ํฝ์ ์ฒ๋ฆฌํด์ผ ํ๋ ์ฑ
๋๋ ์๋น์ค ๊ฐ์ ๊ฒฝ์ฐ, ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ฅผ ์ ์ฉํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ์นดํ์นด๋ฅผ ํตํด ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ ๋์ค์ ๋ถ์ฐ ๋ฝ์ ํ์ฉํด ๋์์ฑ์ ์ ์ดํจ์ผ๋ก์จ ํจ์จ์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋ฉ์ธ ์๋น์ค๋ ์ด๋ฒคํธ ์๋ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค.
[Spring][258] CI/CD ๋ฐ ์ํํธ ์จ์ด ์ํคํ
์ฒ ๋์ ํ๋ฆ ์ ๋ฆฌ
์์ ์งํ ์

์์ ๊ฒฐ๊ณผ

[Spring][258] ํ๋ก ํธ ๋์์ธ ์์
_ ์ฑ
๋๋ ์ด๋ฒคํธ ํ์ด์ง
MySQL DB์ ๋ฐ์ดํฐ์ Elasticsearch ๋ฐ์ดํฐ๋ ๋๊ธฐํ๋ก ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ค.
๊ธฐ์กด MVP ๊ธฐ๋ฅ์ผ๋ก ๋์์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ๋ถ๋ค์ด ์์ต๋๋ค. ํนํ Elasticsearch์ ์ฐ๊ฒฐ๋ ๋์ ๋ชฉ๋ก์์ ์ฌ์ฉ์๋ ๋์ ๋์ถ, ๋์ ๋์ถ ์์ฝ์ ์งํ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ๋์ ๋์ถ์ ์งํํ๋ฉด ๋์์ ๋์ถ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ์ ์๋ Status ์ปฌ๋ผ์ POSSIBLE์์ IMPOSSIBLE๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ํด๋น ๊ธฐ๋ฅ์ HTML์ Ajax HTTP ์์ฒญ์ ํตํด MySQL DB์ ์๋ ๋์ book_id์ ๋์์ ์ํ๋ฅผ ์ฆ์ ๋ณ๊ฒฝํ์ง๋ง, Elasticsearch๋ MySQL์ DB๋ฅผ Logstash๋ก ๊ฐ์ ธ์์ ์ธ๋ฑ์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๊ณผ์ ์์ ์๋ก ๋ชฉ๋ก์ ๋ถ๋ฌ์์ผ ํ ํ์์ฑ์ด ์์ต๋๋ค.
Logstash์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ถ์ ์ค์ ํ์์ฑ
๊ธฐ์กด Logstash๋ฅผ ํตํด MySQL์ DB๋ฅผ ์ ๋ฌํ์ฌ ์์ธํ๋ ๋ถ๋ถ์
๋๋ค. 709๋ง๊ฐ์ ๋์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฝ์ด์ค๋ ๊ณผ์ ์์ JVM์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ํ์์ด ๋ฐ์ํ์ฌ 200๋ง๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ Elasticsearch๋ก ์ ๋ฌํ๋๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ถ๋ถ์์ ์ค์ ์ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
โข
์ต์ด ์คํ 1ํ ์ดํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ํด๋น ์์ค๋ ์ข
๋ฃ๋จ
โข
MySQL DB์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธฐ๋ฉด ์๋์ผ๋ก ํด๋น ํ์ผ์ ๋ค์ ์คํ์์ผ ์ฃผ์ด์ผ ์
๋ฐ์ดํธ๊ฐ ๋จ
โข
๋ค์ ํ๋ฒ 200๋ง๊ฐ์ฉ ์ด 709๋ง๊ฐ๋ฅผ ๋๋ฉด์ ์
๋ฐ์ดํธ๊ฐ ์๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฎ์ด์ฐ๋ ํํ
์ต์ด์ ์ ์ฒด 709๋ง๊ฐ ๋์ ๋ฐ์ดํฐ ์ ๋ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋๋ฐ ์ง์์ ์ผ๋ก ์ด๋ค ๋์์ ์ ๋ณด ์
๋ฐ์ดํธ์ ๋ํ ๋ณ๋ ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ต๋๋ค.
Logstash์ tracking_column์ ์ด์ฉํ ๋ณ๊ฒฝ ์ถ์
๊ณต์ ๋ฌธ์์ ๋ฐ๋ผ์ tracking_column์ ํตํด์ ํน์ ์ปฌ๋ผ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ์ถ์ ํ ์ ์๊ณ , Elasticsearch์ ๋ณ๋๋ ํ๋ง์ ์
๋ฐ์ดํธ ํ ์ ์๋ ๋ฐฉ์์ด ์์์ต๋๋ค.
[Spring][258] MySQLโLogstashโElasticsearch ์ ๋๊ธฐํ ์ฒ๋ฆฌ์์ ๋ฐ์ํ๋ ๋ฌธ์
๊ณตํต - Controller, ๊ฒ์ ํค์๋์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ด์ ๋ธ ๊ฐ์ฒด
์ฐ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋ ์ปจํธ๋กค๋ฌ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ก ํธ์๋๋ก๋ถํฐ keyword ๋ฅผ QueryString์ผ๋ก โฆ?keyword=abc์ ๊ฐ์ ํํ๋ก HTMLํผ์ผ๋ก๋ถํฐ ํน์ ๊ฐ๋ค์ ์ถ์ถ ํ ์ ์์ผ๋ฉฐ, HTTP์์ฒญ์ ๋ด์ ์ปจํธ๋กค๋ฌ๋ก ๋ฌธ์์ด์ ์ ๋ฌ ํ ์ ์์ต๋๋ค.
ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด Total Count๋ฅผ ๋ฝ์์์ ํ์ฌ ๋ด๊ฐ ๋ช๋ฒ์งธ ํ์ด์ง์ธ์ง๋ฅผ ๊ณ์ฐํด์ ํ์๋ฅผ ํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ๊ณ์ฐ์ ๋ชจ๋ ์ง์ ๊ณ์ฐํ๋ ๋ฉ์๋, ๋ณ์๋ฅผ ์ง์ ์์ฑํ๊ณ ๋งค๊ฐ๋ณ์๋ก Service์ ์ ๋ฌํ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ฒ ๋ฉ๋๋ค!ย ํ์ด์ ๋ธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ๋์ด์ผ ํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๋ณต์กํ ์ฝ๋๋ฅผ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด ์คํ๋ง ๋ฐ์ดํฐ JPA๋ ํ์ด์ง๊ณผ ์ ๋ ฌ์ ํ์คํ ํด๋์์ต๋๋ค.
ํ์ฌ ํ์ด์ง, ํ์ด์ง ํฌ๊ธฐ, ์ ๋ ฌ ๊ธฐ์ค, ์ ๋ ฌ ๋ฐฉํฅ์ HTTP์์ฒญ์ผ๋ก ๋ฐ์์ค๊ณ pageable ๊ฐ์ฒด๋ฅผ ํตํด ํ์ด์ง ์ฒ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
keyword, pageable ๊ฐ์ฒด๋ฅผ Service ๊ณ์ธต์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(READ)ํ๋ ๋น์ง๋์ค ๋ก์ง์ ํ์ฉ ๋ ์ ์๋๋ก ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.
์ด๊ธฐ MVP JPA - Service ๊ณ์ธต์์์ ๊ตฌํ ์ํ ์ฝ๋
[Spring][258] JPA โ JPQL โ QueryDSL ๋ณํ๊ณผ์
EC2ํธ ์ฐธ๊ณ ์๋ฃ
EC2 Console์์ MySQL ์ด๊ธฐ ์ค์ ์ฐธ๊ณ
RDS ์ฐ๊ฒฐํ๊ธฐ ํฌํจํธ ์ฐธ๊ณ
EC2์ github pull๋, TEST ๊ฐ ์ถฉ๋์ด ๋๋ค ์ ๊ฑฐํ์, application.properties๋ฅผ ์ง์ ์ฐพ์๊ฐ์ ์์ฑํด์ค์ผํจ
TESTํ์ผ์ ๋น๋ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ณด๋ค. ์ญ์ ํ๊ฒ์ ๋ค์ pull๋ฐ๊ณ ๋๋ฆฌ๋ ๋น๋๊ฐ ๋๋ค.
ํ์ง๋ง ๋ฐํ์๋จ๊ณ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ฐ,
application.properties ํ์ผ ์์ฒด๊ฐ github์์ ์ ์ธ๋์๊ธฐ ๋๋ฌธ,
๋ณด์๋์ github์ ์์ฌ๋ฆฌ๋๋ฐ,
EC2 ์๋ฒ์ปด์์ pull๋ฐ์ผ๋ฉด ์ด๊ฒ์์ฒด๊ฐ ์์ผ๋ ๋น๋ํ๋ฉด JDBC์ ๋ณด ๋ฑ๋ฑ์ ๋ชป์ฐพ์๊ฑฐ๋ค.
.gitignore๋ก ์ ์ธํ๊ฒ์ด ์๋ค๋ฉด, bootjar ๋น๋์ ํ์ํ๊ฒ์ ์ง์ ์ฐพ์๊ฐ์ ์์ฑํด์ค์ผํ๋ค.

์ฐ๋ถํฌ ๋ฐฉํ๋ฒฝ ufw ์ค์ ๋ฐ ํ์ฉ, EC2 ๋ฐฐํฌ์ 8080์ ํน์๋ ๋ง์๋์ง ํ์ธํ ๊ฒ
ufw ํ์ฑํํ๊ธฐ
[Spring][AWS EC2]58 EC2๋ก ๋ฐฐํฌํด๋ณด๊ธฐ
๊ฒ์๊ธ์ ์์๋ ๋๊ธ ์ถ๊ฐํ๋ API
CommentController์์ ๊ณ์ POSTMAN์ผ๋ก blogId ํ๋ผ๋ฏธํฐ๋ฅผ ๋ชป๋ฐ์์จ๋ค.
๋ํ๋๋ ์ค๋ฅ๋ ๋๊ฐ์ง ์ ํ์ด์๋ค.
์ฒซ๋ฒ์งธ๋ NullPointerException์ผ๋ก blogId์์ฒด๊ฐ ์ ๋ฌ๋์ง ์๋ ์ํฉ,
์ด๊ฑด ๋๋ฌด ๋ปํ๋ค. ์ ์ฝ๋์์ blogId๋ฅผ req์ด๋ ๋ณ์, ์ด๋ ๊ณง HttpServletRequest์์ ๋ฐ๊ณ ์๋๋ฐ ์ฌ๊ธฐ ์์๋ฆฌ๊ฐ ์๋ค. ์๋ณธ ๊ธ์ id๋ ํด๋ผ์ด์ธํธ์์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ผ ํ๋ค. ๊ทธ๋์ ์๋ ์ฝ๋์๊ฐ์ด ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. blogId๊ฐ Longํ์
์ผ๋ก ๋ค์ด์ค์ง ์๋๊ฒ ๊ฐ๋ค. ๋ญ๊ฐ ์์ฒญ๋ฌธ์ด ์๋ชป๋์์ ์ ์๋ค.
POSTMAN์์ POST ๋ฐฉ์์ url์ http://localhost:8080/api/comment ์ธ ์ํ์์ ๋ก๊ทธ์ธ์ผ๋ก ์ฟ ํค์์ ํ ํฐ์ ๋ฐ์์ ํค๋์ ๋ฃ์ด์ฃผ์๋ค. Body์๋ ์๋๊ฐ์ด JSON์ผ๋ก ๋ฃ์๋ค. ์์ง๋ ์ด์ํ์ ์ด ์๋ค.
๋ถ๋ช
ํ ์๋ณธ๊ธ์ ํ๋ผ๋ฏธํฐ๋ก id๋ฅผ ๋ฐ์๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ์์ฒญํ๋๋ฐ ์ค๋ฅ๊ฐ๋ฐ์ํ๋ค. ๊ณ์ ChatGPT๋ฅผ ํตํด ๋ฌธ์ํ์ง๋ง ์ ํ ํ๋ฆฐ๊ณณ์ด ์๋ค..

์ด์ํ ํด๊ฒฐ?
[Spring][JPA]55 ๋๊ธ๊ธฐ๋ฅ ๊ตฌํ ์ค ํธ๋ฌ๋ธ์ํ
- POSTMAN ๋ฒ๊ทธ? ์ ํ ์ํ
๋์ง ์์์ ํ๋ฌดํ๋ค. Required request parameter 'Argumentsโ for method parameter type Long is not present
CascadeType.REMOVE
โข
CASCADE์ REMOVE ์ต์
์ ์ ์ฉํ๋ฉด ํด๋น Entity ๊ฐ์ฒด๋ฅผ ์ญ์ ํ์ ๋ ์ฐ๊ด๋ Entity ๊ฐ์ฒด๋ค์ ์๋์ผ๋ก ์ญ์
โข
ํ์ง๋ง REMOVE ์ต์
๊ฐ์ ๊ฒฝ์ฐ ์ฐ๊ด๋ Entity์ ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ๋ค๊ณ ํด์ ์๋์ผ๋ก ํด๋น Entity๊ฐ ์ญ์ ๋์ง๋ ์๋๋ค.
orphanRemoval = true
orphanRemoval ์ต์
๋ REMOVE ์ต์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น Entity ์ฆ, Robbie Entity ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ฉด ์ฐ๊ด๋ ์์ Entity๋ค์ด ์๋์ผ๋ก ์ญ์ ๋๋ค.
โข
orphanRemoval์ด๋ REMOVE ์ต์
์ ์ฌ์ฉํ ๋ ์ญ์ ํ๋ ค๊ณ ํ๋ ์ฐ๊ด๋ Entity๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฐธ์กฐํ๊ณ ์๋์ง ์๋์ง๋ฅผ ๊ผญ ํ์ธ ํ์
โฆ
A์ B์ ์ฐธ์กฐ๋๊ณ ์๋ C๋ฅผ B๋ฅผ ์ญ์ ํ๋ฉด์ ๊ฐ์ด ์ญ์ ํ๊ฒ ๋๋ฉด A๋ ์ฐธ์กฐํ๊ณ ์๋ C๊ฐ ์ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์
โฆ
๋ฐ๋ผ์ orphanRemoval ๊ฐ์ ๊ฒฝ์ฐ @ManyToOne ๊ฐ์ ์ ๋ํ
์ด์
์์๋ ์ฌ์ฉํ ์ ์๋ค.
[Spring][JPA]54 ๊ณ ์ Entity ์ญ์ (๊ฒ์๊ธ-๋๊ธ)
๋ค์๊ณผ ๊ฐ์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ฐธ๊ณ ํ์ฌ Entity๋ฅผ ์์ฑํด๋ณด์.

Member.java
Team.java
Team๊ณผ Member๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ด๋ฉฐ ํค์ ์ฃผ์ธ์ Member์ด๋ค.(@JoinColumn์ผ๋ก Teamํ์
์ team๋ณ์๋ Teamํด๋์ค์ mappedBy๋ก ์ฐธ์กฐ๋์ด์๋ค.) ๋ํ Team Entity์์๋ @OneToMany๋ก List<Member>๋ฅผ Member ์ํฐํฐ์ team ์ฐธ์กฐ๋ณ์์ ๋งตํํ๊ณ ์๋ค.
[Spring][JPA]53 Fetch Type, ์ง์ฐ๋ก๋ฉ(LAZY), ์ฆ์๋ก๋ฉ(EAGER)
JPAย Auditing์ด๋?
Java์์ ORM ๊ธฐ์ ์ธ JPA๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋งคํํ ๋ ๊ณตํต์ ์ผ๋ก ๋๋ฉ์ธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ํ๋๋ ์ปฌ๋ผ๋ค์ด ์กด์ฌํ๋ค. ๋ํ์ ์ผ๋ก ์์ฑ์ผ์, ์์ ์ผ์, ์๋ณ์ ๊ฐ์ ํ๋ ๋ฐ ์ปฌ๋ผ์ด ์๋ค.
๋๋ฉ์ธ๋ง๋ค ๊ณตํต์ผ๋ก ์กด์ฌํ๋ค๋ ์๋ฏธ๋ ๊ฒฐ๊ตญ ์ฝ๋๊ฐ ์ค๋ณต๋๋ค๋ ๋ง์ด๋ฉฐ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ฒ์ ํ๋ก์ ํธ์ ์ ์ง๋ณด์์ ์ธก๋ฉด์์ ํต์ฌ์ ์ธ ์ฌ์์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ย ๋๊ฐ, ์ธ์ ํ์๋์ง ๊ธฐ๋ก์ ์ ๋จ๊ฒจ๋์์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฑ์ผ, ์์ ์ผ ์ปฌ๋ผ์ ๋๋จํ ์ค์ํ ๋ฐ์ดํฐ๋ค.
๊ทธ๋์ JPA์์๋ย Audit์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๋ค. Audit์ย ๊ฐ์ํ๋ค, ๊ฐ์ฌํ๋ค๋ผ๋ ๋ป์ผ๋ก Spring Data JPA์์ ์๊ฐ์ ๋ํด์ ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๊ธฐ๋ฅ. ๋๋ฉ์ธ์ ์์์ฑ ์ปจํ
์คํธ์ ์ ์ฅํ๊ฑฐ๋ ์กฐํ๋ฅผ ์ํํ ํ์ update๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋งค๋ฒ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ์ฌ ์ฃผ์ด์ผ ํ๋๋ฐ, audit์ ์ด์ฉํ๋ฉด ์๋์ผ๋ก ์๊ฐ์ ๋งคํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ์ ๋ฃ์ด์ค ์ ์๋ค.
์์กด์ฑ ์ถ๊ฐ
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง ๋ถํธ์์ gradle๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ๊ฒ ๋ ๊ฒฝ์ฐย spring-boot-starter-data-jpa๋ง ์ถ๊ฐํด๋ Audit์ ํ๋๋ฐ๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ด ๋ง์ Spring-Data-JPA ์์ ํด๋น ๊ธฐ๋ฅ์ด ์๋ค๋ ๋ง๊ณผ ๊ฐ๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ค์ Entity ํด๋์ค ํ์ผ, Timestamped.java
๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์๊ฐ, ์์ ์๊ฐ์ ๊ธฐ๋กํ๊ธฐ ์ํด์ Timestamped.java ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
์ ์ํฐํฐ ํด๋์ค์ Audit๊ด๋ จ ์ฃผ์ ์ด๋
ธํ
์ด์
์ ์ค๋ช
์ ๋ค์๊ณผ ๊ฐ๋ค.
@MappedSuperclass | JPA Entity ํด๋์ค๋ค์ด ํด๋น ์ถ์ ํด๋์ค๋ฅผ ์์ํ ๊ฒฝ์ฐ createDate, modifiedDate๋ฅผ ์ปฌ๋ผ์ผ๋ก ์ธ์ |
@EntityListeners(AuditingEntityListener.class | ํด๋น ํด๋์ค์ Auditing ๊ธฐ๋ฅ์ ํฌํจ |
@CreatedDate | Entity๊ฐ ์์ฑ๋์ด ์ ์ฅ๋ ๋ ์๊ฐ์ด ์๋ ์ ์ฅ |
@LastModifiedDate | ์กฐํํ Entity์ ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์๊ฐ์ด ์๋ ์ ์ฅ |
ํด๋์ค์ ์์
ํด๋น ์ํฐํฐ ํด๋์ค๋ ์๊ฐ์ ๊ธฐ๋กํ๋ ํ๋๋ง์ผ๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์, ํ๋ก์ ํธ ๋ด์ ๋ณธ ์ํฐํฐ์์๋ ์์์ ํตํด์ ํด๋น ํ๋๋ค์ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.(== ํฌํจ๋์ด์ผ ํ๋ค.)
[Spring][JPA]52 JPA Auditing์ด๋? SpringBoot์์ ๊ตฌ์ฑ ๋ฐ ํ์ฑํ ์ํค๊ธฐ ์ค์ต
๋ค๋์ผ (N:1) ๊ด๊ณ ๋จ๋ฐฉํฅ๊ณผ ์๋ฐฉํฅ
1. ๋ค๋์ผ ๊ด๊ณ ๋จ๋ฐฉํฅ
๋ค๋์ผ (N:1) ๊ด๊ณ (๋จ๋ฐฉํฅ)
โข
์์: ํ๋์ ์ฃผ๋ฌธ(Order)์ ํ๋์ ๊ณ ๊ฐ(Customer)์ ์ํฉ๋๋ค.
โข
์ค๋ช
:
โฆ
์ฌ๋ฌ ์ฃผ๋ฌธ์ ๊ฐ์ ๊ณ ๊ฐ์๊ฒ ์ํ ์ ์์ง๋ง, ํ๋์ ์ฃผ๋ฌธ์ ์ค์ง ํ๋์ ๊ณ ๊ฐ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋์ผ ๊ด๊ณ์
๋๋ค.
โฆ
๋ฐ๋ผ์ Order ์ํฐํฐ์๋ customer๋ผ๋ ์์ฑ(๋๋ ์ธ๋ ํค)์ด ์์ ๊ฒ์ด๋ฉฐ, ์ด ์์ฑ์ Customer ์ํฐํฐ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
โข
Spring JPA ์ด๋
ธํ
์ด์
โฆ
@Entity: ์ํฐํฐ ํด๋์ค์์ ํ์ํฉ๋๋ค.
โฆ
@ManyToOne: ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด ์ด๋
ธํ
์ด์
์ Order ์ํฐํฐ์ customer ์์ฑ๊ณผ ๊ด๋ จ๋ฉ๋๋ค.
โฆ
@JoinColumn: ์ธ๋ ํค๋ฅผ ์ง์ ํฉ๋๋ค. @ManyToOne๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์ด๋ค ์ปฌ๋ผ์ด ์ธ๋ ํค์ธ์ง ์ง์ ํฉ๋๋ค. ํค์ ์ฃผ์ธ
2. ๋ค๋์ผ ๊ด๊ณ ์๋ฐฉํฅ
๋ค๋์ผ (N:1) ๊ด๊ณ (์๋ฐฉํฅ)
โข
์์: ํ๋์ ์ฃผ๋ฌธ(Order)์ ํ๋์ ๊ณ ๊ฐ(Customer)์ ์ํฉ๋๋ค. ๋์์ ํ๋์ ๊ณ ๊ฐ๋ ์ฌ๋ฌ ์ฃผ๋ฌธ์ ๊ฐ์ง ์ ์์ต๋๋ค.
โข
Spring JPA ์ด๋
ธํ
์ด์
:
โฆ
@Entity: ์ํฐํฐ ํด๋์ค์์ ํ์ํฉ๋๋ค.
โฆ
@ManyToOne: ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, Order ์ํฐํฐ์ customer ์์ฑ๊ณผ ๊ด๋ จ๋ฉ๋๋ค.
โฆ
@JoinColumn: ์ธ๋ ํค๋ฅผ ์ง์ ํฉ๋๋ค. @ManyToOne๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ์ด๋ค ์ปฌ๋ผ์ด ์ธ๋ ํค์ธ์ง ์ง์ ํฉ๋๋ค.
โฆ
@OneToMany: ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, Customer ์ํฐํฐ์ customer ๋ก ์ฐธ์กฐ๋ฉ๋๋ค. Customer ์ํฐํฐ์์ orders ๋ฆฌ์คํธ์ ๊ด๋ จ๋ฉ๋๋ค.
์ผ๋๋ค (1:N) ๊ด๊ณ ๋จ๋ฐฉํฅ๊ณผ ์๋ฐฉํฅ
1. ์ผ๋๋ค ๊ด๊ณ ๋จ๋ฐฉํฅ
[Spring][JPA]49_2 Entity ์ฐ๊ด๊ด๊ณ ํ๊ฐ๋ ค์ ์์๋ฅผ ํตํด ํ๋ฒ ๋ ์ ๋ฆฌ
์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ณ ๋ ค์ฌํญ 3๊ฐ์ง
โข
๋ค์ค์ฑ
โฆ
๋ค๋์ผ : @ManyToOne (๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ)
โฆ
์ผ๋๋ค : @OneToMany
โฆ
์ผ๋์ผ : @OneToOne
โฆ
๋ค๋๋ค : @ManyToMany (์ค๋ฌด์์ ์ฌ์ฉํ์ง ์์)
โข
๋จ๋ฐฉํฅ, ์๋ฐฉํฅ
โฆ
ํ
์ด๋ธ
โช
์ธ๋ํค ํ๋๋ก ์์ชฝ ์กฐ์ธ ๊ฐ๋ฅ
โช
์ฌ์ค ๋ฐฉํฅ์ด๋ผ๋ ๊ฐ๋
์ด ์์
โฆ
๊ฐ์ฒด
โช
์ฐธ์กฐ์ฉ ํ๋๊ฐ ์๋ ์ชฝ์ผ๋ก๋ง ์ฐธ์กฐ ๊ฐ๋ฅ
โช
ํ์ชฝ๋ง ์ฐธ์กฐํ๋ฉด ๋จ๋ฐฉํฅ
โช
์์ชฝ์ด ์๋ก ์ฐธ์กฐํ๋ฉด ์๋ฐฉํฅ ( ์ฌ์ค ๋จ๋ฐฉํฅ ์ฐธ์กฐ๊ฐ 2๊ฐ ์๋ ๊ตฌ์กฐ!)
โข
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
โฆ
ํ
์ด๋ธ์ย ์ธ๋ํค ํ๋๋ก ๋ ํ
์ด๋ธ์ด ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์
โฆ
๊ฐ์ฒด ์๋ฐฉํฅ ๊ด๊ณ๋ A โ B, B โ A ์ฒ๋ผย ์ฐธ์กฐ๊ฐ 2๊ตฐ๋ฐ
โฆ
๊ฐ์ฒด ์๋ฐฉํฅ ๊ด๊ณ๋ ์ฐธ์กฐ๊ฐ 2๊ตฐ๋ฐ ์์. ๋ ์ค ํ
์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ ๊ณณ์ ์ง์ ํด์ผ ํจ
โฆ
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ : ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ฐธ์กฐ
โฆ
์ฃผ์ธ์ ๋ฐ๋ํธ : ์ธ๋ํค์ ์ํฅ์ ์ฃผ์ง ์์. ๋จ์ ์กฐํ๋ง ๊ฐ๋ฅ(์ฝ๊ธฐ)
๋ค๋์ผ[N:1] ์ฐ๊ด๊ด๊ณ
๋ค๋์ผ[N:1] ๋จ๋ฐฉํฅ
โข
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ์ฐ๊ด๊ด๊ณ
โข
๋ค๋์ผ์ ๋ฐ๋๋ ์ผ๋๋ค
โข
ํญ์ ๋ค(N)์ชฝ์ ์ธ๋ํค๊ฐ ๋ค์ด๊ฐ์ผ ํจ!

@ManyToOne ์ฃผ์์์ฑ
โข
๋ค๋์ผ ๊ด๊ณ ๋งคํ
๋ค๋์ผ[N:1] ์๋ฐฉํฅ
[Spring][JPA]49 Entity ์ฐ๊ด๊ด๊ณ N:1, 1:N, 1:1, N:M ๋งตํ ๋ฐ ๋ฐฉํฅ
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ชฐ์์น๋ฉฐ ๋ฐฐ์ด ํ ์ฃผ
์ฌ์ค ๋๋ฌด ๋ง์ ์ ๋ณด๊ฐ ํ๋ฒ์ ๋ค์ด์๋ค. ๊ทธ๋๋ง ์ดํดํ๋ฉด์ ๋์ด๊ฐ๊ณ ์ ์กฐ๊ธ ์๊ฐ์ ๊ฑธ๋ฆฌ๊ณ ์์ง๋ง, ์๊ฐ๋ณด๋ค ๋๋ฌด ์ค์ํ ๊ธฐ๋ฅ ๊ตฌํ๊ณผ ๊ฐ๋
, ์ค์ต์ ๋์์ ์งํํ๋ค๋ณด๋ ์๊ฐ์ฒ๋ผ ์ข ๋ง ๋์ด๊ฐ๋ ๊ฒ์ด ๋๋๋ค. ๊ทธ๋งํผ ์ค์ํ ๋ถ๋ถ์ธ ๊ฒ์ ์๊ฐํ๋ฉด์ ์ง์งํ๊ฒ ๊ณต๋ถํ๊ณ , ์ต๋ํ ๋ง์ ๊ฒ๋ค์ ๋จธ๋ฆฌ์์ ์ง์ด๋ฃ์ผ๋ ค๊ณ ๋
ธ๋ ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๊ฐ๋ณด๋ค Java์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋
์ด ๋ฐํ์ง ์์ ์ํ์๋ค๋ฉด ์ ๋ง ํฌ๊ธฐํ์์ง๋ ๋ชจ๋ฅผ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์ด์ ์๋์ ํ์จ์ ์ฌ๋ฉด์ ๋ชจ๋ ๊ฒ์ ์ธ์ฐ๊ฑฐ๋ 100%๊น์ง ํก์ ํ์ง ๋ชปํ๋๋ผ๋, ๋ด๊ฐ ๊ฐ์๋ฅผ ๋ณด๊ณ , ์ค์ต์ ํ๊ณ , ํ
์คํธ๋ฅผ ํ ๋, ๊ทธ ํ๋ฆ์ ์ดํด ํ ์ ์์ ์์์ ๊ฐ์ฌํ๋ฉด์ ๊ณต๋ถ๋ฅผ ์งํํ ํ์ฃผ์๋ค.
์ค์ํ ์ค์ต์ด ๋ง์ ๋งํผ ๋ง์ ๋ฐ์ ์ด ์์๊ณ , ์ ๋ฆฌ๋ฅผ ๋ ์ํ๊ณ ์ ๋
ธ๋ ฅ
์ฐ์ ๋ธ๋ก๊ทธ์ ์ํ๋ฅผ ๊พธ์คํ ๊ด๋ฆฌํ๋ฉฐ ํ ์ฃผ๋ฅผ ์์ํ์๋ค. ๋งค์ผ TIL์ 3~4๊ฐ ์์ฑํ๋ ๋๋ก์จ๋ ํ๋ซํผ์ ์์ ์ ์ธ ์๋น์ค๊ฐ ์๋, ๋ด๊ฐ ๋ด ๋ฐ๋ชฉ์ ๋ถ์ก๋ฏ์ด ๋ถ์์ ํ ์ด๋ณด ๊ฐ๋ฐ์์ ๋ฐฐํฌ๋ฅผ ์์งํ์๊ณ , ์ญ์๋ ๋ฐฐํฌ์ ์ต์ ํ ๊ด๋ฆฌ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ ์์๋ค. ๋๋ ์ด ์ํฉ์ ์ต๋ํ ์ ์ฐํ๊ฒ ๋์ด๊ฐ๊ธฐ ์ํด์ ์ฌ๋น ๋ฅด๊ฒ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฏธ์ง ์ต์ ํ, ๋ธ๋ก๊ทธ์ ๋น๋ํ์ ์ค๋ฒํ๋ก์ฐ์ ์์ธ ๋ฑ์ ํ์
ํ๊ธฐ ์์ํ๊ณ , ์ 2์ ๋ฐฉ์์ธ ๊ธ๋ค์ ๋ค๋ฅธ DB๋ก ๋ฐฑ์
ํ๋ ์ฐจ์ ์ฑ
์ ๋ง๋ จํ๋ค. ๋คํํ ๋
ธ๋ ฅ ๋์ ๋ธ๋ก๊น
์ ์กฐ๊ธ ์์ ์ ์ผ๋ก ๋ณํํ๊ณ , ์ผ์ถ ๊ทธ ๋ฌธ์ ์ ๋ค์ ์ค๊ณฝ์ด ์กํ๊ณ ์๋ค. ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ ์์ง ๋ฉ์์ง๋ง, ์ด์์ ์ธ ๋ฉด์์ ๊พธ์คํ ๊ธ์ ์
๋ก๋ ํ ๋ฃจํด์ ๋ฐ๊ฒฌํ๋ค๋๊น?
๋ํ์ฌ ํฌ๊ฒ ๋ณ๊ฒฝ๋ ๊ฒ์ Github์ ์ ๊ทน์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์๋ ๊ฒ์ด๋ค. ๊ธฐ๋ก๊ณผ ๋จ๋๊ฒ๋ค์ ๋ํด์ ์ง์งํ๊ฒ ์๊ฐํ๊ณ ์๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด ๊พธ์คํจ๊ณผ ๋
ธ๋ ฅ์ ๊ฐ๊ด์ ์ผ๋ก ํ๊ฐ ํ ์ ์๋ ์งํ๊ฐ ์ด๊ฒ๋ค ๋ฟ์ด๋ผ, ๋ง๋ง ์ํ๊ณ ๊ธ๋ง ์์ด๋ค๊ณ ํด์ ํด๊ฒฐ ๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์๋ค. ๋ํ GIthub์ ๊พธ๋ฉฐ๋๊ฐ๋ฉด์ ๋ฐฐ์ด๊ฒ์ โ๋๋ฅผ ๋ธ๋๋ฉโ ํ๋ ๋ฐฉ๋ฒ์ด์๋ค. ํ๊ณผ ์ด ๋ถ๋ถ์ ๋ํด์ ์๋ก์ ๊ฐ์น๊ด์ ๋ํด์ ์ค๋ ์๊ฐ๋์ ์ง์งํ ์ฌ๋ฌ ์ด์ผ๊ธฐ๋ฅผ ๋๋๊ฒ ๋์๊ณ , 1์ผ 1์ปค๋ฐ ์ด์์ผ๋ก ๋ด ์์งํ ๊ณต๋ถ์ ์ด์ ์ ๋ณด์ฌ ์ค ์ ์๋ ๊ฐ๊ด์ ์ธ ์๋ฃ์ ์ค๋น๋ฅผ ๋์์ ํ๊ณ ์๊ธฐ๋ ํ๋ค. ๋ฌผ๋ก ์๋์ ์ธ๊ฒ์ด ์๋๋ค. ๋๋ ์๋ ์ด๋ฐ ๊ฒ๋ค์ ๊พธ๋ฉฐ๋๊ฐ๊ณ ์์ฑํ๊ณ ์ ๋ฆฌํ๋ ๊ฒ์ ์ฆ๊ธฐ๋๋ฐ, ๋ฐฉ๋ฒ์ ๋ชฐ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ข์ ์ฌ๋ก๋ค์ ์ฐพ์๋ณด๋ฉด์ ํ๋ค๋ณด๋ ๋๋ฌด ์ฌ๋ฐ๋ค. ๋งํฌ๋ค์ด ๋ฌธ๋ฒ๋ ๋ญ๊ฐ ์ฌ๋ฐ๋๊ฒ ์์ ๊ฒ ๊ฐ์ ๋๋?
์ธ์์ ๋ฉํ , ๊ฐ์ฅ ์กด๊ฒฝํ๋ ์ธ๋ฌผ?
๋๋ ์น ํ์ ๋จ์ํ ๊ฐ์กฑ, ํ์ ์
์ฅ์ผ๋ก๋ง ํ์ ๋ฐ๋ผ๋ณด์ง ์๋๋ค. ์ด๋ป๊ฒ ๋ณด๋ฉด IT์
๊ณ์ ๋์ ๋ฐฐ์ธ ํ์ ํ๋๋ค์ ์กด๊ฒฝํ๊ณ ์๊ณ , ์ด๋ฆด๋๋ถํฐ ๊ทธ ํน์ ์ ์ถ์ง๋ ฅ๊ณผ ๋์ง๊น, ์ง์์ ๊ฐ์ ์ ์ผ๋ก ์ํฅ์ ๋ฐ์์ค๋ฉด์ ์๋๊ณ ํ์ฌ๋ ์ํฅ์ ์ฃผ๊ณ ๋ฐ๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ ๊ฐ์ ํ๊ฒฝ์ ์ผ๋ก ๋งค์ฐ ์ข์ ์ด์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์ฐ๋ฆฌ ํ์ ๋์๊ฒ ๋จ์ํ ๊ณ ๊ธฐ๋ฅผ ์ฃผ์ง ์์๋ค. ๋ด๊ฐ ์ด์๊ฐ ์ ์๋๋ก ๊ณ ๊ธฐ ์ก๋ ๋ฒ์ ์๋ ค์ฃผ๊ณ , ์ง๋ํ๋ ์๋ฒ์ง์ ์ญํ ์ ํ๋ฉด์ ๋ํ ๋ณธ์ธ๋ ํ๋๊ณผ ๊ฒฐ๊ณผ๋ก ๋ณด์ฌ์ฃผ๋ฉด์ ๋์๊ฒ ํฐ ๋๊ธฐ๋ถ์ฌ์ ๊ท๊ฐ์ด ๋๋ ์ธ๋ฌผ์ด๋ค. ๊ทธ๋์ ๋๋ ์ธ์์์ ์ ์ผ ์กด๊ฒฝํ๋ ์ฌ๋์ด ํ์ผ ์ ๋ฐ์ ์๋ค. ๊ฒฐ๊ตญ ๋ด๊ฐ ๊ฐ์ง ๋ผ์๊น์ง ๊น์ ๊ณ ๋ฏผ์ด๋ ์ง๋ก, ์ถ์ ๊ฑฑ์ ์ ๋ํด์ ๋ชจ๋ ๊ฒ์ ํธ์ด๋ฒ๋ฆฌ๋ฉด์ ์ด์ผ๊ธฐ ํ ์ฌ๋, ๊ทธ๋ผ๊ณผ ๋์์ IT ์
๊ณ์ ๋์ ๋ฐฐ์ ์์ ๋กญ๊ฒ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ์ ์๋ ์ฌ๋์ด ์นํ์ด๋ผ๋ ๊ฒ์ ์์ฒญ ํฐ ํ์ด์ด๋ผ๊ณ ์๊ฐํ๋ค. ์ฃผ๋ณ ๋ค๋ฅธ ํ์ ๊ด๊ณ์ ๋นํด์ ์ฐ๋ฆฌ ํ๊ณผ ๋์ ๊ด๊ณ๋ ์ด๋ฆด๋๋ถํฐ ์์ฃผ ๋ง์ด ์นํ ํธ์ด๊ณ , ๊ทธ ์ฐ์ ๊ฐ ๋ณดํต 20๋ ์คํ๋ฐ์ฏค ์๋ก ์ด์๊ฐ๋๋ผ ๋ฐ์ ํ
๋ฐ, ์ฐ๋ฆฌ ํ์ ๋ ๋์ด๋ฅผ ๋จน์ด๊ฐ๋ฉด์๋ ์๋ก ๋์ฑ ๊ด๊ณ๊ฐ ์ ์ง๋๊ณ ์คํ๋ ค ํจ๊ป ์ฑ์ฅํ ๋์ด๋์ ๊ฑธ๋ง๊ฒ ์์ฐ์ ์ด๊ณ ๋ฏธ๋ ์งํฅ์ ์ธ ๊ฐ์น๊ด, ์ง์์ ๋ํ ์ฑ
์๊ฐ์ ๊ณต์ ํ๋ ๊ฒ์ผ๋ก ๋ฐ์ ํด๊ฐ๊ณ ์๋ค. ๋ ๋ํ ํ์ฌ ์ฒญ์ถ์ ๊ทธ ์ฑ
์๊ฐ์ ๋์ด์ฃผ๊ณ ํจ๊ปํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฑ์ํ ์ด๋ฅธ์ผ๋ก ํจ๊ป ๋ฑ๋ฐํด ๋๊ฐ์ผ ํ๋ค. ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ํ์ ๋ฐ์์ทจ์ ์์์ด ๋ง์ ํ๊ณ , ๋ํ๋ฅผ ํตํด ์ง์
์ ๋ํ ์ฑ
์๊ฐ, ์ ์ฑ์ ์ฐพ๋ ๋ฐฉ๋ฒ, ์ถ์ ๋ชฉํ๋ฅผ ์ค์ ํ๋ ๊ฒ, ์ด๊ฒ๋ค์ ๊ณง ์ธ์์ด๋ ๋จ์ด๋ฅผ ๋ฐฐ์ด๋ค. ๋๋ฌด๋๋ ํฐ ํ์ด์ด๋ค. Spring์ ํตํด ๊ฐ๋ฐ์๋ค์๊ฒ ๋ด์ด ์จ๊ฒ ์ฒ๋ผ ๋๋ ๋น์ฅ์ ํ๋ค๊ณ ์ด๋ ต๊ฒ ๋๊ปด์ง์ง๋ง Spring์ ๋ฐฐ์ ๋๊ฐ๋ฉด์ ๋ด ์ธ์์๋ ๋ด์ด ์ค๊ธธ ๊ธฐ๋ํ๊ณ ์๋ค.
์ด๋ฒ์ฃผ์ ๋ฐฐ์ด ๋ถ๋ถ์ ์ ๋ฆฌ๋ฅผ ํนํ๋ ์ํด์ผ ๋๋ค.
์ด๋ฒ์ฃผ๋ ์ ๋ง ๋ง์ ๊ฒ๋ค์ ๋ฐฐ์ ์ผ๋ฉด์ SpringBoot์์ ์ค์ ํ๋ก์ ํธ๋ก ์ด์ด ์ง ์ ์๋ ํต์ฌ ๊ฐ๋
๊ณผ ์ค์ต์ด ์งํ๋์๋ค. ์งง์ ๊ธฐ๊ฐ ์ด์ํ๋ ์ง์ค๋ ฅ๊ณผ ๋์ง๊น์ผ๋ก ์ด๋ฒ์ฃผ๋ ์ต์ ์ ๋คํด์ ๋ฟ๋ฏํ๋ค. ๋์ด์ผ๋ด๋ ๋ด๊ฐ ์ธ์์์ ์ดํ ๋ก ์ด์ฌํ ๊ฐ์ ํ๊ฒ ๊ณต๋ถํ์ ์ด ์์๋? ์๋ฅ๋, ๋ํ์์ ๋ ๋ชจ๋ ์ต์ ์ ๋คํ์ง๋ง ์ด ์ ๋๋ก ์ด์ ์ ์ด์ง๋ ์์๊ณ ์ค์ค๋ก ์๊ธฐ์ฃผ๋์ ์ธ์ ๋ ์์๋ค. ํ๋ฃจ 4์๊ฐ๋ง ์๋ฉด์ ์ง๊ธ 2๋ฌ์ ๋๊ฒ ๊ณ์ํ๊ณ ์๋๋ฐ, ๊ทธ๋ฐ๋ฐ ํ์ด ๋ค์ง ์๋๋ค. ์ฆ๊ธฐ๊ณ ์๋ค ์คํ๋ ค ์๊ฐ์ด ๋ถ์กฑํด์ ์์ฝ๋ค. ์ง๋๊ฐ ๋ฐ๋ ค์์ด์ ์์ฝ๋ค. ๊ธํ๋ฉด ์๊ฐ์ด ๋๊ฑธ๋ฆฐ๋ค. ์ด๋ฐ ๋ฌผ๋ฆฌ์ ์ธ ์๊ฐ์ ํ๊ณ๋ฅผ ๊ฒ๊ทธ๋๋ง ํจ์จ์ ์ผ๋ก, ๋จ๋ค๋ณด๋ค ๋ ์ด์ฌํ๋ผ๋ ์ฌ์ฉํ๊ณ ์, ๋ฐธ๋ฐ์ค๋ฅผ ์ก๊ณ ์ ๋๋ ํ๊ท ์๋๋ก ๋ฌ๋ฆฌ๊ณ ์์ ๋ฟ์ด๋ค. ๋๋ ํ์ฌ์ ๋ด๊ฐ ์๋์ค๋ฝ๊ณ , ์ด ์๊ฐ์ ์ธ์์์ ์ง์ฌ์ผ๋ก ์ต์ ์ ๋คํ ์๊ฐ์ผ๋ก ํ์ ๊ธฐ์ต๋จ์ ๋ช ์๋๋ ๋ฟ๋ฏํ ์๊ฐ์ผ ๊ฒ์ด๋ค. ์ฒญ์ถ์์ ์ ๊ฐ์ฅ ์ด์ฌํ ๊ณต๋ถํ๊ณ ๋
ธ๋ ฅํ๋ ๋๋ก ๊ธฐ์ต๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ค. ์ค๋ ๋ฟ๋ง์ด ์๋๋ค, ๊ณ์ ๊ทธ๋ ๊ฒ ๋ฐ์ ํ ๊ฒ์ด๊ณ ๊ณ์ํด์ ์ด์ ์ ๋๋ฅผ ์ด๊ฒจ๋จน๋ ๋ด๊ฐ ๋์ผ ํ๋ค.
ํ๋ก์ ํธ ์ค์ต์ ํตํด์ ๋ณต์ตํ๊ธฐ
๊ฐ์๋ ๊ต์ฌ๋ฅผ ์ฃผ๊ตฌ์ฅ์ฐฝ ๋ฐ๋ณตํด์ ๋ค์๋ณด๋ ๊ฒ์ ๋นํจ์จ์ ์ผ ์ ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค. ๋ฌผ๋ก ๊ฐ๋
์ด ์ ๋ฆฌ ์๋ ๋ถ๋ถ๋ค์ ์กฐ๊ธ ํ์ํ๊ฒ ์ง๋ง, ์คํ๋ ค ์ค์ต์ ํตํด์ ์ด๋ฒ์ฃผ์ ๋ฐฐ์ด ๋ถ๋ถ๋ค์ ํ๋ฒ ๋ค๋ค๋ณด๋ฉด์ ํ๋ฒ ์ต์ํด์ง๊ณ , ๊ทธ ๋ค์ ๋ ํ๋ก์ ํธ๋ฅผ ํตํด์ ๋ ์ต์ํด์ง๊ณ ์ด ๊ณผ์ ์ด ๋ฐ๋ณต๋์ด์ผ ํ ๊ฒ ๊ฐ๋ค. ์ง๊ธ ๋ด๊ฐ Java์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ I, II๋ถ๋ถ์ด ๊ฒฐ๊ตญ ์ง๊ธ Spring๊ณผ SpringBoot๋ฅผ ํ๋ฉด์ ๊ทธ Java์ ๊ธฐ๋ณธ๊ธฐ๋ค์ด ๊ณ์ํด์ ๋ฐ๋ณต๋๋ฉฐ ์ฌ์ฉ๋๊ณ ์๊ณ , ์ ์ ๋ ์ต์ํด์ง๊ณ ์์๊ณผ ์์คํจ์ ๋๋๋ค. ๋ฐ๋ผ์, SpringBoot๋ ์ด๋ฒ์ฃผ์ ๋ฐฐ์ด ์ด๋
ธํ
์ด์
๋ง ํ 30~40๊ฐ๋ ๋๋๊ฒ ๊ฐ๋ค. ์ ์ ์ด ์์ง๋ง ๋ด๊ฐ ์ง์ ํ๋ก์ ํธ์์ ๊ตฌํํด๋ณด๊ณ ๋ํ๋ฒ ๋๋ผ๊ณ , ๋ถ์กฑํ ๋ถ๋ถ์ ์ฒดํฌํ๋ ๋ฐฉ์์ผ๋ก ์กฐ๊ธ ๋๋ํ๊ฒ ๊ณต๋ถํ๊ณ ์ ํ๋ค.
[Spring]50 ์ค์ํ ๊ธฐ๋ฅ์ ๋ง์ด ๋ฐฐ์ด ํ ์ฃผ, ๋๋๊ฒ๋ ๋ง์ ํ ์ฃผ, ๋๊ธฐ๋ฅผ ๋ค์ ๋ถ์ฌํ๋ ํ์ฃผ.
์ ์์ฝ, ํ ์์
JPA๋ ์๋ฐ ์ง์์ ORM ๊ธฐ์ ์ ๋ํ API ํ์ค ๋ช
์ธ์ด๋ฉฐ
Hibernate๋ JPA์ ๊ตฌํ์ฒด์ด๊ณ , ๋ด๋ถ์ ์ผ๋ก JDBC๋ฅผ ์ด์ฉํ๋ค.
Spring Data JPA๋ JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ์คํ๋ง์์ ์ ๊ณตํ๋ ๋ชจ๋๋ก ๋ด๋ถ์ ์ผ๋ก JPA ๊ตฌํ์ฒด๋ฅผ ์ด์ฉํ๋ค.
JPA์ด์ ์ ๋ฐฐ๊ฒฝ, SQL Mapper๋?
SQL Mapper๋ ๊ฐ๋ฐ์๊ฐ ์ง์ SQL๋ฌธ์ ์์ฑํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ Persistence Framework์ด๋ค. ๊ฐ์ฒด์ ํ
์ด๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ง์ ๋งคํํ๋ ๊ฒ์ด ์๋, SQL๋ฌธ์ ์คํํด ์ฟผ๋ฆฌ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ค ๊ฐ์ฒด์ ๋งคํํ ์ง ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐ๋ผ์ DBMS์ ์ข
์์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ ์ ์๋ค. ๋ํ์ ์ผ๋ก MyBatis๊ฐ ์๋ค. ์ฌ๊ธฐ ๋จ๊ณ๊น์ง๋ JDBC Template๋ฅผ ๊ฐ์ ํด์ ์ฌ์ฉํ์ง๋ง, ๊ฒฐ๊ตญ SQL๋ฌธ์ ์ง์ ์์ฑํด์ผ๋๋ค๋ ๋จ์ ์ด ์๋ค.
์ฅ์
โข
JDBC๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ถํธํจ์ ์ค์ผ ์ ์๋ค.
โข
SQL์ด ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
โข
์ธ๋ถ์ ์ธ SQL ๋ณ๊ฒฝ์ ํธ๋ฆฌํ๋ค
โข
๊ธฐ์กด์ SQL๋ฌธ๋ฒ์ ๊ทธ๋๋ก ์ ์ฉํ ์ ์์ด ์๋ก์ด ๊ธฐ์ ์ ํ์ตํ์ง ์์๋ ๋๋ค.
๋จ์
โข
DBMS ๋ณ๋ก SQL ๋ฌธ๋ฒ์ด ๋ค๋ฅด๋ค.
โข
๊ฐ๋ฐ์๊ฐ ์ง์ SQL๋ฌธ์ ์์ฑํด์ผ ํ๋ค.
[Spring][JPA]51 JPA๋? MyBatis(SQL Mapper)๋ถํฐ ์์ ํต์ฌ์์ฝ
developers.naver.com
๋ค์ด๋ฒ์ ๊ฐ๋ฐ์ ํ๋ซํผ์ ํตํด์๋ ๋ค์ด๋ฒ๊ฐ ๋ง๋๋ ๊ฐ์ข
Open API๋ฅผ ํ์ฉ ํ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด๋ฒ์ ๋ถ๊ฐ ๊ธฐ๋ฅ๋ค๊ณผ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
API๋ช
| ์ค๋ช
| ํธ์ถ์ ํ |
๊ฒ์ | ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ, ์ด๋ฏธ์ง, ์น, ๋ด์ค, ๋ฐฑ๊ณผ์ฌ์ , ์ฑ
, ์นดํ, ์ง์iN ๋ฑ ๊ฒ์ | 25,000ํ/์ผ |
๋ค์ด๋ฒ ๋ก๊ทธ์ธ | ์ธ๋ถ ์ฌ์ดํธ์์ ๋ค์ด๋ฒ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ | ์์ |
๋ค์ด๋ฒ ํ์ ํ๋กํ ์กฐํ | ๋ค์ด๋ฒ ํ์ ์ด๋ฆ, ์ด๋ฉ์ผ ์ฃผ์, ํด๋์ ํ๋ฒํธ, ๋ณ๋ช
, ์ฑ๋ณ, ์์ผ, ์ฐ๋ น๋, ์ถ์์ฐ๋, ํ๋กํ ์กฐํ | ์์ |
Papago ๋ฒ์ญ | Papago ๋ฒ์ญ ์ธ๊ณต์ ๊ฒฝ๋ง ๊ธฐ๋ฐ ๊ธฐ๊ณ ๋ฒ์ญ | 10,000๊ธ์/์ผ |
CLOVA Face Recognition | ์
๋ ฅ๋ ์ฌ์ง์ ์
๋ ฅ๋ฐ์ ์ผ๊ตด์ค๊ณฝ/๋ถ์/ํ์ /์ ๋ช
์ธ ๋ฎ์๋๋ฅผ ๋ฆฌํด | 1,000๊ฑด/์ผ |
๋ฐ์ดํฐ๋ฉ(๊ฒ์์ดํธ๋ ๋) | ํตํฉ๊ฒ์์ด ํธ๋ ๋ ์กฐํ | 1,000ํ/์ผ |
๋ฐ์ดํฐ๋ฉ(์ผํ์ธ์ฌ์ดํธ) | ์ผํ์ธ์ฌ์ดํธ ๋ถ์ผ๋ณ ํธ๋ ๋ ์กฐํ | 1,000ํ/์ผ |
์บก์ฐจ(์ด๋ฏธ์ง) | ์๋ ์
๋ ฅ ๋ฐฉ์ง์ฉ ๋ณด์ ์ด๋ฏธ์ง ์์ฑ ๋ฐ ์
๋ ฅ๊ฐ ๋น๊ต | 1,000ํ/์ผ |
์บ๋ฆฐ๋ | ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์บ๋ฆฐ๋์ ์ผ์ ์ถ๊ฐ ๊ฐ๋ฅ | 5,000ํ/์ผ |
์นดํ | ํน์ ๋ค์ด๋ฒ ์นดํ ๊ฐ์
ํ๊ธฐ | 50ํ/์ผ |
์นดํ | ๋ค์ด๋ฒ ํ์์ด ๊ฐ์
ํ ์นดํ ๊ฒ์ํ์ ๊ธ ์ฐ๊ธฐ | 200ํ/์ผ |
๋จ์ถURL | ์
๋ ฅ๋ URL์ me2.do ํํ์ ์งง์ URL๋ก ๋ณํ | 25,000ํ/์ผ |
๊ณต์ ํ๊ธฐ | ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ, ์นดํ ๊ณต์ ํ๊ธฐ | ์์ |
์ฐ์ ๋์ ๋ค์ด์ค๋ ๊ธฐ๋ฅ๋ค
๊ฒ์, ๋ค์ด๋ฒ ๋ก๊ทธ์ธ, ๋ค์ด๋ฒ ํ์ ํ๋กํ ์กฐํ, Papago ๋ฒ์ญ, ๊ฒ์์ด ํธ๋ ๋ ์กฐํ, ์ผํ์ธ์ฌ์ดํธ ๋ถ์ผ๋ณ ํธ๋ ๋ ์กฐํ, ์บก์ฐจ, ์บ๋ฆฐ๋ ๊ธฐ๋ฅ์ ์น ์๋น์ค์์ ์์ฃผ ์ฌ์ฉ๋ ๊ฒ ๊ฐ๋ค. ์ด์ค์ ๋ค์ด๋ฒ ๊ฒ์ ์์ฒญ API๋ฅผ SpringBoot์ผ๋ก ๊ตฌํํ๊ณ ์ ํ๋ค.
์์ ์ CLOVA ๊ธฐ๋ฅ๋ค์ ์ ์ ์ดํด๋ณธ์ ์ด ์์๋๋ฐ ๋ณด๋ค ๋ง์ ๊ธฐ๋ฅ๋ค์ด ์์๋ค. AI๊ด๋ จ ๊ธฐ๋ฅ๋ ์์์ผ๋ฉฐ ๋ฐ์ดํฐ์ฌ์ด์ธ์ค ๋ถ์ผ์ ๊ธฐ๋ฅ๋ค๋ ์์๋๊ฒ์ผ๋ก ๊ธฐ์ตํ๋ค. ์ข
๋ฅ๋ ์๊ฐ๋ณด๋ค ์์ฃผ ๋ง์์ ์ต๋ณตํฉ ์์ด๋์ด๋ฅผ ๊ตฌ์ ํ ๋ ํต์ฌ์ ์ผ๋ก ์ฌ์ฉ ๋ ๋ฏ ํ๋ค.
๊ทธ ์ธ ๋ค์์ ์ฃผ์๊ฒ์ API๋ ์ ๋ช
ํ๊ฒ ๊ฐ๊ณ , ์๋ง๋ CLOVA์์ ์๋๋ฏ ํ๋ฐ ์ง๋ ๋ฐ GPS๊ธฐ๋ฅ ๋ฑ์ด ์์ ๊ฒ์ด๋ค. ์นด์นด์ค๋ ์ฃผ๋ ฅ ์๋น์ค๋ค๊ณผ ์ฐ๊ด๋ Open API๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ค๋ณต๋๋ ๊ฒ๋ค๋ ๋ง๋ค. ์ฌ์ค ์ด๋ค ๊ธฐ๋ฅ์ ์ ํ ํ๋๊ฒ์ ์ด๋ค ์๋น์ค๋ฅผ ๋ง๋ค ์ง ๊ณํํ๊ณ ๊ธฐํ ๋จ๊ณ์์ ์๊ฐํ ๋ฌธ์ ์ด๋ค.
๋๋ ํด๋ผ์ด์ธํธ ์
์ฅ์ด๋ค.
โข
์ค์ ๋ก ์์ฒญ์ ๋ณด๋ด๋ ์์์ ์ ๋ด ์๋ฒ๋ก๋ถํฐ ์์๋๋ค.
โข
๋ฐ๋ก ์ ์ค์ตํ๋ ๋ด์ฉ ์ค ๋ด๊ฐ ํด๋ผ์ด์ธํธ ์
์ฅ์ด๋ค.
โข
๋ค์ด๋ฒ๊ฐ ์๋ฒ ์ญํ ์ ํ๊ฒ ๋๋ค. ๋ญ API ๋ฉ์๋๊ฐ ๋์๋์ง ์ ์ ์๋ค. ํ์ง๋ง ๊ทธ ์์ฒญ ํค๋, ๋ฐ๋, ๋ฐฉ์ ๋ฑ ๋ชจ๋ ๊ฒ๋ค์ ํด๋น API ๋ํ๋จผํธ์์ ์ง์ ํ๊ณ ์๋ค. ๊ทธ ์์์ ๋ง๋๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐํ ํ์
์ ์ค๊ณํด๋๋ฉด ๋๋ค.
โข
๋๋ ์์ฒญ์ ๋ณด๋ด๊ณ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ API๋ฅผ ๊ฐ๋ฐํ๋ฉด ๋๋ค.
โฆ
์ฐ์ NAVER Developers์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑ
โฆ
์ฌ์ฉํ API๋ฅผ ์ ํํ๊ณ (โ๊ฒ์ ๊ธฐ๋ฅโ)
โฆ
ํ๊ฒฝ ์ค์ (โWEBโ)
โฆ
์๋น์ค URL(โhttp://localhostโ)
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ์ข
๋ฃ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ Client ID, Client Secret ์ด๋ฉฐ ์์ฒญ ์ ํค๋์ ํด๋น ์ ๋ณด๋ฅผ ๋ด์์ ์์ฒญํด์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
ํ๋ก์ ํธ์์ Client ID์ Client Secret์ ์จ๊ธฐ์.
[Spring]48 NAVER โSearchingโ Open API Test
RestTemplate์ด๋ ๋ฌด์์ผ๊น?
โข
์ง๊ธ๊น์ง๋ Client ์ฆ, ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ์
์ฅ์์ ๊ฐ๋ฐ์ ์งํํด์๋ค.
โข
์๋น์ค ๊ฐ๋ฐ์ ์งํํ๋ค๋ณด๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ง์ผ๋ก๋ ๊ตฌํ์ด ํ๋ ๊ธฐ๋ฅ๋ค์ด ๋ฌด์ํ ๋ง์ด ์กด์ฌํ๋ค.
โข
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ์ ์๋น์ค์์ ํ์๊ฐ์
์ ์งํํ ๋ ์ฌ์ฉ์์ ์ฃผ์๋ฅผ ๋ฐ์์ผ ํ๋ค๋ฉด? GPS๋ฅผ ํตํ ์์น ์๋ฃ๊ฐ ํ์ํ๋ค๋ฉด? ๋ฑ๋ฑ
โฆ
์ฃผ์, GPS๋ฅผ ๊ฒ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํ๋๋ฐ ์ง์ ๊ตฌํ์ ํ๊ฒ๋๋ฉด ๋ง์ ์๊ฐ๊ณผ ๋น์ฉ์ด ๋ค์ด๊ฐ๋ค.
โฆ
๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋์ง ์๋ฆฌ๋ถํฐ ํ์
ํ๋๋ฐ ์ฐ๊ตฌ ์๊ฐ, ๊ฐ๋ฐ ์๊ฐ์ด ๋๋ฌด ์ค๋๊ฑธ๋ฆด ์ ์๋ค.
โฆ
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ ๊ทผํ๊ธฐ ์ด๋ ค์ด ์ด๋ฐ ๋ถ๋ถ๋ค์ API ์์ฒญ์ ๋ํ ์๋ต๋ฐ์ดํฐ๋ก ๋ค์ํ๊ฒ ์ ๊ณตํด์ฃผ๊ณ ์๋ ๊ธฐ์
๋๋ ๊ณต๊ณต๊ธฐ๊ด์ด ์๋ค.
์ด๋ด ๋, ๋ด๊ฐ ๊ฐ๋ฐํ๋ ์๋ฒ๋ Client์ ์
์ฅ์ด ๋์ด ์๋ก Kakao ์๋ฒ์ ์์ฒญ์ ์งํํด์ ๋ฐ์์ผ ํ๋ค.
โข
Spring์์๋ ์๋ฒ์์ ๋ค๋ฅธ ์๋ฒ๋ก ๊ฐํธํ๊ฒ ์์ฒญํ ์ ์๋๋ก RestTemplate ๊ธฐ๋ฅ์ ์ ๊ณต
๊ฒฐ๋ก ์ ์ผ๋ก ๋ด ํฌ์ง์
๋ํ ํด๋ผ์ด์ธํธ ์
์ฅ์ด ๋์ด์ ์ด๋ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํ๋ค.
โข
์น ํ์ด์ง(ํ๋ก ํธ์๋, ํด๋ผ์ด์ธํธ)
(์๋ฒ)๋์ ๋ฐฑ์๋ ์๋ฒ
โฆ
ํ์ฌ๊น์ง ์งํํ ๊ณผ์ ๋ค์ ๋๋ถ๋ถ ์ด๋ฌํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๋ค๋ก ๊ฐ๋๋ผ๋ ํญ์ ์ด ๊ด๊ณ๋ ๋ณํ์ง ์๋๋ค.
โฆ
ํ์ง๋ง ๋ด๊ฐ ์ํ๋ ๋ฐ์ดํฐ์ ์ถ์ฒ๊ฐ ์ธ๋ถ ๋ค๋ฅธ ์๋น์ค์ ์๋ค๋ฉด?
โข
๋์ ๋ฐฑ์๋ ์๋ฒ(ํด๋ผ์ด์ธํธ)
(์๋ฒ)์ธ๋ถ ๋ฐฑ์๋ ์๋ฒ
โฆ
์์ ๊ฐ์ ๊ด๊ณ๊ฐ ๋์ด์ผ ํ๋ค.
โฆ
๋ฐ๋ผ์ ์ ์ฒด์ ์ธ ํ๋ก์ ํธ๋
โข
์น ํ์ด์ง(ํ๋ก ํธ์๋, ํด๋ผ์ด์ธํธ)
(์๋ฒ)๋์ ๋ฐฑ์๋ ์๋ฒ(ํด๋ผ์ด์ธํธ)
(์๋ฒ)์ธ๋ถ ๋ฐฑ์๋ ์๋ฒ
โฆ
์ด์ ๊ฐ์ด ์ค๊ฐ์ ์์น์์ ๋๊ฐ์ง ์ญํ ์ ๋ชจ๋ ์ํํ๋ ํฌ์ง์
์ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ฒ ์ค์ต์ ํตํด์ ์ฐ์ธก ๋ถ๋ถ์ธ ๋์ ๋ฐฑ์๋ ์๋ฒ(ํด๋ผ์ด์ธํธ)
(์๋ฒ)์ธ๋ถ ๋ฐฑ์๋ ์๋ฒ ๋ถ๋ถ์ ๋ค๋ค๋ณธ๋ค
์ด ๋ถ๋ถ์ด ํด๊ฒฐ ๋๋ฉด ์ปจํธ๋กค๋ฌ์์ ๊ธฐ์กด ์น ํ์ด์ง์์ API ์ค๊ณ๋ฅผ ์๊ธฐ๋ง ํ๋ฉด ์ต์ข
์ ์ธ ํํ๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋๋ค.
RestTemplate๋ ๊ธฐ์กด API ์์ฒญ๊ณผ ๋น์ทํ๊ฒ GET ๋๋ POST ๋ฑ์ผ๋ก ์์ฒญ์ ์งํ ํ ์ ์๋ค. ๊ฐ ์์ฒญ ๋ฐฉ์๋ง๋ค ์ด๋ป๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ์์ฒญํ๊ณ ์ด๋ ํ ๋ฐ์ดํฐ ํ์
์ ์์ฒญํ ์ ์๋์ง ์ค์ต์ ํตํด ์ดํด๋ณด์๋ค.
IDE์ Client์
์ฅ์ ๋์ ์๋ฒ ๋ ๋ค๋ฅธ IDE์ ์ธ๋ถ ๊ธฐ๊ด ๋ฑ์ ์
์ฅ์ธ ๋ฐ์ดํฐ ์๋ฒ๋ฅผ ๋์์ ์ผ๊ณ ๊ทธ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ค์ ์ดํด๋ณด์๋ค.
Spring์์๋ ์ด๋ ๊ฒ ๋ฐฑ์๋ ์๋ฒ๊ฐ ์ธ๋ถ ์๋ฒ๋ก๋ถํฐ ์์ฒญ์ ํ๋ ๊ฒ์ ๋ณด๋ค ๊ฐํธํ๊ฒ, ์ง๊ด์ ์ผ๋ก ๊ตฌ๋ถ ํ ์ ์๋๋ก RestTemplate์์ getCall, postCall ๋ฑ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ฃผ๊ณ ์๋ค. ์ค์ ๋ก Service์ getForEntity, postForEntity์์ ์๋ฒ๋ก์ ์์ฒญ, ์๋ต์ ๋ฐ์์ค๊ฒ ๋๋ค.
[Spring]47 RestTemplate ์ค์ต Client-Server ํ
์คํธ(Open API์ ์๋ฆฌ ์ดํด๋ฅผ ์ํด)
UUID ํ์ค ์ ๋ฆฌ
โข
๋คํธ์ํฌ ์์์ ๊ณ ์ ์ฑ์ด ๋ณด์ฅ๋๋ id๋ฅผ ๋ง๋ค๊ธฐ ์ํ ํ์ค ๊ท์ฝ
โข
UUID๋ Universally Unique IDentifier์ ์ฝ์ด์ด๊ณ ๋ฒ์ฉ ๊ณ ์ ์๋ณ์๋ผ๊ณ ํ๋ค.
โข
์ฃผ๋ก ๋ถ์ฐ ์ปดํจํ
ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ์๋ณ์์ด๋ค. ์ค์๊ด๋ฆฌ์์คํ
์ด ์๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๊ฐ ์ธ์
์ ์ผ๋ จ๋ฒํธ๋ฅผ ๋ถ์ฌํด์ค์ผ๋ก์จ ์ ์ผ์ฑ์ ๋ณด์ฅํ ์ ์๊ฒ ์ง๋ง ์ค์์์ ๊ด๋ฆฌ๋์ง ์๋ ๋ถ์ฐ ํ๊ฒฝ์ด๋ผ๋ฉด ๊ฐ๋ณ ์์คํ
์ด id๋ฅผ ๋ฐ๊ธํ๋๋ผ๋ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋์ด์ผ๋ง ํ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด ํ์ํ ๊ฒ์ด ๋ฒ์ฉ๊ณ ์ ์๋ณ์ UUID์ด๋ค.
โข
RFC 4122์ ๋ช
์๋์ด ์๋ค.
โข
UUID๋ 128๋นํธ์ ์ซ์์ด๋ฉฐ, 32์๋ฆฌ์ 16์ง์๋ก ํํ๋๋ค.
โข
8์๋ฆฌ-4์๋ฆฌ-4์๋ฆฌ-4์๋ฆฌ-12์๋ฆฌ ํจํด์ผ๋ก ํ์ดํ์ ์ง์ด ๋ฃ์ด 5๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๊ตฌ๋ถํ๋ค.
โข
์ด๋ฆ ๊ธธ์ด (๋ฐ์ดํธ) ๊ธธ์ด (16์ง์ ์ซ์) ๋ด์ฉ
time_low 4 8 ์๊ฐ์ low 32๋นํธ๋ฅผ ๋ถ์ฌํ๋ ์ ์
time_mid 2 4 ์๊ฐ์ middle 16๋นํธ๋ฅผ ๋ถ์ฌํ๋ ์ ์
time_hi_and_version 2 4 ์ต์์ ๋นํธ์์ 4๋นํธ "version", ๊ทธ๋ฆฌ๊ณ ์๊ฐ์ high 12๋นํธ
clock_seq_hi_and_res clock_seq_low 2 4 ์ต์์ ๋นํธ์์ 1-3๋นํธ, ๊ทธ๋ฆฌ๊ณ 13-15๋นํธ ํด๋ญ ์ํ์ค
node 6 12
48๋นํธ ๋
ธ๋ id
UUID ์ข
๋ฅ
โข
์ข
๋ฅUUID๋ฒ์ ์ 1,3,4,5๊ฐ ์๋ค. ์ด์ค ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฒ์ ์ 1๋ฒ์ ๊ณผ 4๋ฒ์ ์ด๋ค.
โข
1๋ฒ์ ๊ฐ์ ๊ฒฝ์ฐ, ํ์์คํฌํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋๋ค. (ํธ์คํธ ID, ์ํ์ค ๋ฒํธ ๋ฐ ํ์ฌ ์๊ฐ์ผ๋ก UUID ๋ฐ๊ธ)
โข
4๋ฒ์ ๋ ๋๋ค ์์ฑ (๋ฌด์์ UUID ์์ฑ) ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
โข
๋ํ 3๋ฒ์ MD5 (์ด๋ฆ๊ณต๊ฐ ์๋ณ์ [UUID] ๋ฐ ์ด๋ฆ [๋ฌธ์์ด]์ ํด์๊ธฐ๋ฐ), 5๋ฒ์ SHA-1 (์ด๋ฆ๊ณต๊ฐ ์๋ณ์ [UUID] ๋ฐ ์ด๋ฆ [๋ฌธ์์ด]์ ํด์๊ธฐ๋ฐ)ํด์ฌ๋ฅผ ์ด์ฉํด ์์ฑํ๋ ๋ฐฉ์์ด ์๋ค.
โข
โป์ฃผ๋ก 1๋ฒ์ ๋ณด๋ค๋ 4๋ฒ์ ์ ๋ง์ด ์ฌ์ฉํ๋ค.
์ ํ์์๋ UUID๋ฅผ ์์ฑํ ๋ 4๋ฒ์ ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
์ด๋ 1๋ฒ์ ๊ฐ์ ๊ฒฝ์ฐ์ ํธ์คํธID๋ฅผ ๊ฐ์ง๊ณ ๋ฐ๊ธ์ด ์ด๋ฃจ์ด ์ง๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ํด์๋ ์ ์ถ ๊ฐ๋ฅ์ฑ์ด ์์ด ๋๋ค์์ฑ์ผ๋ก UUID๋ฅผ ๋ฐ๊ธ๋ฐ์ ๋ณด์์ฑ์ ๋์๊ฒ์ผ๋ก ์ถ์ธก์ด ๋๋ค.
1.
JAVA์์์ UUID ์ฌ์ฉ๋๋ JAVA๊ฐ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์ JAVA์์์ UUID 4๋ฒ์ ์ ์ด์ฉํ์ฌ ์์ฑํด ๋ณผ ๊ฒ ์ด๋ค.
2.
UUID 4๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด java.util.UUID (UUID 3๋ฒ์ , 4๋ฒ์ ์ง์) API๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
3๋ฒ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ย nameUUIDFromBytesย ์ฌ์ฉ
[Spring][JPA]42 UUID?
ํต์ฌ ์ด๋
ธํ
์ด์
@Entity
โข
@Entity ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํ๋ ์ํฐํฐ์ด๋ค
โข
JPA๋ฅผ ์ฌ์ฉํด์ ํ
์ด๋ธ๊ณผ ๋งคํํ ํด๋์ค๋ @Entity ์ด๋
ธํ
์ด์
์ด ํ์๋ค
โข
๊ธฐ๋ณธ ์์ฑ์ ํ์(ํ๋ผ๋ฏธํฐ๊ฐ ์๋ public ๋๋ protected ์์ฑ์)
โข
final ํด๋์ค, enum, interface, inner ํด๋์ค ์ฌ์ฉ X
โข
์ ์ฅํ ํ๋์ final ์ฌ์ฉ X
โข
name ์์ฑ์ ์ฌ์ฉํ๋ฉด JPA์์ ์ฌ์ฉํ ์ํฐํฐ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ค.
โฆ
๊ธฐ๋ณธ๊ฐ์ ํด๋์ค ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค
์์:
@Table
โข
@Table ์ด๋
ธํ
์ด์
์ ์ํฐํฐ์ ๋งคํํ ํ
์ด๋ธ์ ์ง์ ํ๋ค.
โข
name ์์ฑ์ผ๋ก ๋งคํํ ํ
์ด๋ธ ์ด๋ฆ ์ง์ ์ด ๊ฐ๋ฅํ๋ค
โข
๊ธฐ๋ณธ๊ฐ์ ์ํฐํฐ ์ด๋ฆ์ด๋ค
์์ :
[Spring][JPA]41 ์ํฐํฐ ๋งคํ, ํ๋ ์ปฌ๋ผ ๋งคํ, ๊ธฐ๋ณธํค ๋งคํ ๋ฑ ํ์ฌ๊น์ง ์ฃผ์ ์ด๋
ธํ
์ด์
์ ์ ์ ์ญํ ๊ตฌ๋ถ์ ๋ฐ๋ผ(๊ด๋ฆฌ์/์ผ๋ฐํ์/๋ฑ๋ฑ) ์ ๊ทผ ๊ฐ๋ฅํ ํ์ด์ง๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ
Controller์ ์์ฒญ๋ฉ์๋์์ Security์ @Secure ์ด๋
ธํ
์ด์
์ ํตํด์ ํ์์ ์ญํ ์ด๋ ํ์์ ๊ตฌ๋ถ์ ์ํด ๋ง๋ ํ์
์ ๋ํ์ฌ ํน์ ํ์ด์ง๋ค์ ์ ๊ทผ์ ํ์ฉ ๋๋ ๋นํ์ฉ ํ ์ ์๋ค.
ํนํ ๊ด๋ฆฌ์ ํ์ด์ง๋ ๊ด๋ฆฌ์ ์ญํ ์ ํ์๋ง์ด ๋ก๊ทธ์ธํ ์ํ์์ ์ ๊ทผํด์ผ ๋๋ ์ ์ด ์ค์ํ๊ณ , ๊ทธ ์ธ์๋ ํ์๋ค์ ์คํ์, ์ ํ์ ๋ฑ์ผ๋ก ๋ฑ๊ธ๋ณ ์ ๊ทผ ๊ฐ๋ฅ ๊ฒฝ๋ก๋ฅผ ์ธ๋ถ์ ์ผ๋ก ๋๋ ์ผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ๋ฅ์ ์ ํ์ฉํด์ผ ํ๋ค.
์ ๊ทผ ์์ฒญ ๋ฉ์๋์ @Secured ์ด๋
ธํ
์ด์
์ถ๊ฐ
์๋์ ๊ฐ์ด ์ ๊ทผ์ ๋ํ ์ ํ์ ๊ฑธ์ด ๋ ํ์๊ฐ์๋ ์์ฒญ์ ๋ฉ์๋์ ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ๋ค.
์ด์ ๊ฐ์ด ์ค์ ํ๋ฉด ๋ก๊ทธ์ธ๋ ํ์์ ์ธ์ฆ ์ ๋ณด๋ก๋ถํฐ ์ฌ์ฉ์ ๊ตฌ๋ถ์ ์ํด role์ด๋ผ๋ ๊ฒ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฐ์ ์ฝ์ด์ค๋ฉฐ, ๊ณง ํด๋น ๊ฒฝ๋ก๋ ๋ก๊ทธ์ธ๋ ํ์์ role ๊ฐ์ด ADMIN์ธ ๊ฒฝ์ฐ์๋ง ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋๋ค.
WebSecurityConfig.java์์ ์ ๊ธฐ๋ฅ์ ํ์ฑํ ์ํค๊ธฐ
์์ฒญ ๋ฉ์๋์์ ๊ตฌ์ฑํ ์ดํ์ ํด๋น ์ด๋
ธํ
์ด์
์ด ์๋ํ๊ฒ๋ ํ๋ ค๋ฉด ํด๋น ํ๋ก์ ํธ์ SecurityConfig๋ฅผ ๋ค๋ฃจ๊ณ ์๋ WebSecurityConfig.java ์์ ํด๋์ค์ @EnableGlobalMethodSecurity(securedEnabled = true) ๋ฅผ ์ถ๊ฐํ๋ฉด์ ์ปจํธ๋กค๋ฌ์ ์ด๋
ธํ
์ด์
์ด ํ์ฑํ๋๊ฒ ๋๋ค.
์ ๊ทผ ๋ถ๊ฐ ํ์ด์ง forbidden.html๋ก ์๋ดํ๊ธฐ
ํด๋น URL ์์ฒญ ๋๋ ํ์ด์ง ์ ๊ทผ ๊ถํ์ด ์๋ ์ ์ ๊ฐ ์ง์
ํ๋ ค ์๋ํ๋ฉด ๊ทธ์ ๋ฐ๋ฅธ ๋ฐ์์ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค. ๋ณดํต forbidden๊ณผ ๊ฐ์ ์๋ชป๋ ์ ๊ทผ์ ๋ํ ๊ฒฝ๊ณ ๋ฌธ ๋ฑ์ด ํฌํจ๋ ์น ํ์ด์ง๋ฅผ ๋ฐํํ์ฌ ์๋ชป๋ ๊ฒฝ๋ก๋ผ๋ ๊ฒ์ ์ธ์ง์์ผ ์ฃผ๊ฒ ๋๋ค.
ํ๋จ์ exceptionHandling์ ํตํด ์ ๊ทผ ์คํจ ์ accessDeniedPage(โ๋ณด์ฌ์คํ์ด์ง๊ฒฝ๋กโ)๋ฅผ ํตํด์ ์์ฑํ ํ์ด์ง๋ก redirect ์ํฌ ์ ์๋ค.
WebSecurityConfig.java์์ ์ ๊ทผ ๊ถํ ๋ฐ ์ ๊ทผ ๋ถ๊ฐํ์ด์ง ์๋ด๋ฅผ ์์ฑํ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
[Spring]43 Spring Security - @Secured ๋ฅผ ํตํ ์ ์ ๊ตฌ๋ถ์ ๋ฐ๋ฅธ ์ ๊ทผ ๊ฐ๋ฅ ํ์ด์ง, ๋๋ ๊ทธ ์ธ ์์ฒญ ์ ํํ๊ธฐ
1. Query String์ด๋
Query String์ด๋ ์๋ฒ์๊ฒ ๋ฌด์์ด ํ์ํ์ง, ํน์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฌด์์ด ํ์ํ์ง ๋ฌป๋ ๋ฌธ์์ด์ ์๋ฏธ, Query String์ ์๋์ ๊ฐ์ ํํ๋ก ๊ตฌ์ฑ๋๋ค.
์์ ์์์ ๋ํ๋๋ฏ์ด ์ฃผ์ ๋ค์ โ?โ๋ฅผ ๋ถ์ฌ์ ํํํ๋ค.โkey=valueโํํ๋ก ํค์ ๊ฐ์ ์์ฑํ๊ณ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด โ&โ๋ฅผ ๋ถ์ฌ์ค๋ค.
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ผ ๋ถ๋ฆฌ๋ ๊ฒ์ ์ด ์ฟผ๋ฆฌ์คํธ๋ง๊ณผ ํผ์ฉ๋์ด ์ฌ์ฉ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ ์๋ฏธ๋ค.
2. Path Variable์ด๋
Path Variable์ด๋ Query String๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋ก ๊ฒฝ๋ก๋ฅผ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค. Path Variable์ ์๋์ ๊ฐ์ ํํ๋ก ๊ตฌ์ฑ๋๋ค.
๋ง๊ทธ๋๋ก Path๊ฐ ์์ผ๋ฏ๋ก ๊ฒฝ๋ก๋ฅผ ์๊ฐํ์. ๊ทธ ๋ฐ๋๋ ์ฟผ๋ฆฌ์คํธ๋ง์ด๋ผ๊ณ ๊ธฐ์ตํ๋ฉด ํธํ ๋ฏ. ๊ฐ๋
3. Query String๊ณผ Path Variable์ ๊ฐ๊ฐ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ
Query String์ ๋ฆฌ์์ค๋ค์ ์ ๋ ฌ, ํํฐ๋ง ํน์ ํ์ด์งํ๋ ๊ณณ์ ์ฌ์ฉํฉ๋๋ค. ์๋์ ์์์ ๊ฐ์ด writer๊ฐ nick์ธ ๊ฒ์๊ธ ๋ฆฌ์คํธ๋ผ๋ ํํฐ๋ง๋ ๋ฆฌ์์ค๋ค์ ๊ฐ์ ธ์ค๋๋ฐ ์ฌ์ฉ
Path Variable์ ๊ตฌ์ฒด์ ์ธ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉํ๋ค. ์๋์ ์์์ ๊ฐ์ด id๊ฐ 444์ธ ๊ฒ์๊ธ์ด๋ผ๋ ๊ตฌ์ฒด์ ์ธ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋๋ฐ ์ฌ์ฉ
[Spring]46 QueryParameter, QueryString, PathVariable์ ๊ฐ๊ฐ ๋ฌด์์ด๊ณ ์ธ์ ์ฌ์ฉ๋๋๊ฐ?
Validation์ด๋?
ํ๋ก๊ทธ๋๋ฐ์ ํ๋๋ฐ์ ์์ด์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋
โข
ํนํ๋ Java๋ null ๊ฐ์ ๋ํ ์ ๊ทผ์ ๋ํด NullPointerException ์ค๋ฅ๊ฐ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ถ๋ถ์ ์๋ฐฉํ๊ธฐ ์ํด Validation ์ฆ, ๊ฒ์ฆ ๊ณผ์ ์ด ํ์
โข
Spring์์๋ null ํ์ธ ๋ฟ ์๋๋ผ ๋ฌธ์์ ๊ธธ์ด ์ธก์ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ฆ ๊ณผ์ ๋ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก Bean Validation ์ ๊ณต
โข
build.gradle : validation ์์กด์ฑ ์ฃผ์
Bean Validation
โข
Bean Validation
โฆ
๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ์ ๋ํ
์ด์
์ ์ ๊ณต
@NotNull | null ๋ถ๊ฐ |
@NotEmpty | null, โโ ๋ถ๊ฐ |
@NotBlank | null, โโ. โ โ ๋ถ๊ฐ |
@Size | ๋ฌธ์ ๊ธธ์ด ์ธก์ |
@Max | ์ต๋๊ฐ |
@Min | ์ต์๊ฐ |
@Positive | ์์ |
@Negative | ์์ |
@Email | E-mail ํ์ |
@Pattern | ์ ๊ท ํํ์ |
์ ํจ์ฑ ๊ฒ์ฌ ์์
์ ํจ์ฑ ๊ฒ์ฌ ๋์ ๊ฐ์ฒด์ ํ๋์ ๊ฐ ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํด์ค๋ค.
์ปจํธ๋กค๋ฌ์์ ๋์ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ๋ฉ์๋๋ฅผ ํตํด ํ
์คํธ๋ฅผ ์งํํ๋ค. ์ด ๋ ๋์ ๊ฐ์ฒด์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ์ฑํ ์ํค๋ ค๋ฉด @Valid ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ค์ผ ํ๋ค.
POSTMAN์ผ๋ก ํด๋น URL์ ํตํ POST ์์ฒญ ํ
์คํธ์์ ํน์ ํ๋์ ๊ฐ์ ์ผ๋ถ๋ฌ ์ ๋ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ํ๋๊ฒ ๋๋ค.
[Spring]44 SpringBoot์์์ Validation ์ ํจ์ฑ ๊ฒ์ฌ์ ๋ก๊ทธ
์ ํจ์ฑ ๊ฒ์ฌ์ ์ปค์คํฐ๋ง์ด์ฆ
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ด๋
ธํ
์ด์
ํํ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ก๋ ๊ธฐ๋ณธ์ ์ธ ์ ๊ท์ ํจํด์ด ์
๋ ฅ๋์ด ์๋ค. ํ์ง๋ง ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์ ๊ท ํํ์ ํจํด์ ๊ตฌํํ๋ ค๋ฉด ์ ๊ท ํํ์์ ์ดํดํ๊ณ ์์ ๋ณผ ์ ์์ด์ผ ํ๋ค.
์ ๊ท ํํ์(Regular Expression)์ด๋?
์ ๊ท์(Regular Expression)์ ๋ฌธ์์ด์์ ํน์ ๋ด์ฉ์ ์ฐพ๊ฑฐ๋ ๋์ฒด ๋๋ ๋ฐ์ทํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค.
๊ทธ ์ค ์ ํ๋ฆฌ์ผ์ด์
์์ ์์ฃผ ํ์ฉ๋๋ ๊ฒ์ ์ ๊ท์์ ํน์ ๋ฌธ์, ์ซ์์ ๋งค์นญ ํจํด, ๊ฒ์ ๊ธฐ์ค ํจํด, ๊ฐฏ์ ๋ฐ๋ณต ํจํด ์ ๋๋ ์ต์ํด์ ธ์ผ ํ๋ค. ์ธ์ฐ์ง ๋ชปํ๋๋ผ๋ ๋ค๋ฅธ ์์ ๋ณด๊ณ ์ด๋์ ๋ ํ์
ํ ์์ค์ ์ต์ํด์ง๋ฉด ์๊ฐ์ ๋ญ๋นํ์ง ์์ ์ ์๋ค.
Spring์์๋ @Pattern ์ด๋ผ๋ ์ด๋
ธํ
์ด์
์ ํตํด์ ํด๋น ํ๋์ ์ ํจ์ฑ ๊ฒ์ฌ์ ์ ๊ท ํํ์์ ์ ์ฉ ์ํฌ ์ ์๋ค.
์์๋ก Email ํ์ : ๊ณ์ @๋๋ฉ์ธ.์ต์์๋๋ฉ์ธ ์ฒ๋ผ ๋ํ๋ด๊ณ ์ถ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ปค์คํฐ๋ง์ด์ฆ ํ์ฌ ๋ณด๋ค ์ธ๋ฐํ ์กฐ์ ์ ํ ์ ์๋ค.
์ด์ธ์ ์๋ ์ฐธ๊ณ ์ฌ์ดํธ๋ฅผ ํตํด์ ๋ค์ํ ์์ ๋ค์ ์์งํด๋์๋ค.
์ ๊ท์ ์ค๋ฌด ์์
ํน์ ๋จ์ด๋ก ๋๋๋์ง ๊ฒ์ฌ
์ซ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋์ง ๊ฒ์ฌ
[Spring]45 Validation์ ์ปค์คํฐ๋ง์ด์ฆ, ์ ๊ท ํํ์(Regular Expression)
MySQL | Java |
TINYINT | Integer |
BIT | Boolean |
BOOL/BOOLEAN (TINYINT(1)) | Integer |
SMALLINT | Unsigned ์๊ด์์ด Integer |
MEDIUMINT | Integer, Unsinged๋ผ๋ฉด Long |
INT | Integer, Unsigned๋ผ๋ฉด Long |
BIGINT | Long, Unsigned๋ผ๋ฉด java.math.BigInteger |
FLOAT | Float |
DOUBLE | Double |
DECIMAL | java.math.BigDecimal |
DATE | java.sql.Date |
DATETIME | java.sql.Timestamp |
TIMESTAMP | java.sql.Timestamp |
TIME | java.sql.Timestamp |
YEAR | yearsIsDateType์ด ์ค์ ๋๋ค๋ฉด java.sql.Date,์๋๋ผ๋ฉด Short |
CHAR | ์ปฌ๋ผ์ด Binary๋ก ์ค์ ๋์ง ์์๋ค๋ฉด String,๋ผ ์๋ค๋ฉด byte[] |
VARCHAR | CHAR์ ๋์ผ |
BINARY | byte[] |
VARBINARY | byte[] |
TINYBLOB | byte[] |
TINYTEXT | String |
BLOB | byte[] |
TEXT | String |
MEDIUMBLOB | byte[] |
MEDIUMTEXT | String |
LONGBLOB | byte[] |
LONGTEXT | String |
ENUM | String |
SET | String |
[Spring][JPA]39 MySql - Java ๋ฐ์ดํฐ ํ์
1XX Informational
1xx ๋ฒ๋์ ์ํ ์ฝ๋๋ค์ ์์ฒญ์ด ์์ ๋์ด ์ฒ๋ฆฌ ์ค์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
๋ค๋ง ํ์
์์๋ ์ ์ฌ์ฉ๋์ง ์๋ ์ํ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ ๊น๊ฒ ๋ค๋ฃจ์ด ์ง์ง๋ ์๋๋ค.
2XX Success
2xx ๋ฒ๋์ ์ํ ์ฝ๋๋ค์ ์์ฒญ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
๋จ์ํ ์์ฒญ์ ๋ํ ์ฑ๊ณต์ ๋ํ๋ด์ง๋ง, ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ํ์์ ๋ํ ์ฑ๊ณต์ธ์ง์ ๋ํ ๊ฒ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์, ์๋ต์ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ์ทจํ ํ์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์ค์ํ๋ฉด์๋ ์ ๋ง ์์ฃผ ๋ณด๊ฒ๋ ์ํ ์ฝ๋์ผ ๊ฒ์ด๋ค.
3XX Redirection
3xx ๋ฒ๋์ ์ํ ์ฝ๋๋ค์ ๋ฆฌ๋ค์ด๋ ์
์ ์๋ฏธํ๋ฉฐ, ์ด๋ ์์ฒญ์ ์๋ฃํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์์
์ด ํ์ํจ์ ์๋ฏธํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๊ด์ฌ ์์ด ํ๋ ๋ฆฌ์์ค์ ๋ํด ๋ค๋ฅธ ์์น๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ๋งํด์ฃผ๊ฑฐ๋ ๊ทธ ๋ฆฌ์์ค์ ๋ด์ฉ ๋์ ๋ค๋ฅธ ๋์ ์๋ต์ ์ ๊ณตํ๋ค.
๋ฆฌ๋ค์ด๋ ์
(Redirection)์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ URL์ ๋ํด ๋ค๋ฅธ URL์ ๋ค์(re) ์ง์(direct)ํ์ฌ ๋ค๋ฅธ ์ฃผ์๋ก ์ด๋ํ ์ ์๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค. HTTP ์ ์ฌ์ฉ๋๋ ๋ฆฌ๋ค์ด๋ ์
์ ํฌ๊ฒ 3๊ฐ์ง ์ข
๋ฅ๋ก ๋๋ ์ ์๋ค.
โข
์๊ตฌ ๋ฆฌ๋ค์ด๋ ์
(Permanent) : ํน์ ๋ฆฌ์์ค์ URL ์ด ์๊ตฌ์ ์ผ๋ก ์ด๋
โข
์ผ์ ๋ฆฌ๋ค์ด๋ ์
(Temporary) : ํน์ ๋ฆฌ์์ค์ URL ์ด ์ผ์์ ์ผ๋ก ์ด๋
โข
ํน์ ๋ฆฌ๋ค์ด๋ ์
(Special) : ์บ์๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ์ฌ๋ถ
4XX Client Error
4xx ๋ฒ๋์ ์ํ ์ฝ๋๋ค์ ํด๋ผ์ด์ธํธ ์ค๋ฅ๋ฅผ ์๋ฏธํ๋ฉฐ, ์๋ชป๋ ๋ฌธ๋ฒ ๋ฑ์ ์ค๋ฅ๋ก ์ธํด ์๋ฒ๊ฐ ์์ฒญ์ ์ํํ ์ ์๊ณ ๊ทธ ์์ธ์ด ํด๋ผ์ด์ธํธ์๊ฒ ์์์ ๋ปํ๋ค. ์๋ชป ๊ตฌ์ฑ๋ ์์ฒญ ๋ฉ์ธ์ง ๊ฐ์ ๊ฒ์ด ์์ ์ ์์ผ๋ฉฐ, ์กด์ฌํ์ง ์์ URL ์์ฒญ๋ ์์ ์ ์๋ค.
[Spring]38 HTTP ์ํ์ฝ๋์ ๋ํ ์ ๋ฆฌ
Controller์ Service ๊ฐ์ ์์ธ ์ฒ๋ฆฌ ๊ณ์ธต ์ ํ ๊ถ์ฅ์ฌํญ
โข
Controller์์ ์์ธ ์ฒ๋ฆฌ: ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์ ์ง์ ์ํธ์์ฉํ๋ Controller ๊ณ์ธต์์๋ ์์ธ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
โข
Controller๋ HTTP ์์ฒญ์ ๋ฐ์๋ค์ด๊ณ ์๋ต์ ๋ฐํํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ํํ HTTP ์ํ ์ฝ๋ ๋ฐ ์๋ต ๋ฉ์์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์
โข
Controller์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ํด๋ผ์ด์ธํธ์์ ์ํธ์์ฉ์ ๋ ๋ช
ํํ๊ฒ ๊ด๋ฆฌ
Service์์ ๋น์ฆ๋์ค ๋ก์ง ์์ธ ์ฒ๋ฆฌ
โข
๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ Service ๊ณ์ธต์์๋ ๋น์ฆ๋์ค ๊ท์น์ ๋ฐ๋ฅธ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
โข
Service ๊ณ์ธต์ ๋ฐ์ดํฐ ์กฐ์ ๋ฐ ๋น์ฆ๋์ค ๊ท์น์ ๊ตฌํํ๋ ๊ณณ์ด๋ฉฐ, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ์ ํจ์ฑ์ ๊ด๋ฆฌํด์ผ ํ๋ค.
โข
๋ฐ๋ผ์ ๋ฐ์ดํฐ ์กฐ์๊ณผ ๊ด๋ จ๋ ์์ธ๋ Service์์ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ ์ ์๋ค.
๊ถ์ฅ ์ฌํญ์ ์ด์
โข
์ญํ ๊ณผ ์ฑ
์์ ๋ถ๋ฆฌ
โฆ
Controller์ Service๋ ์๋ก ๋ค๋ฅธ ์ญํ ๊ณผ ์ฑ
์์ ๊ฐ์ง๊ณ ์๋ค. Controller๋ ํด๋ผ์ด์ธํธ์์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ฉฐ, Service๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ด๋ฆฌ. ๊ฐ ๊ณ์ธต์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ญํ ๊ณผ ์ฑ
์์ ๋ถ๋ฆฌํ๊ณ ์ฝ๋์ ์์ง์ฑ์ ๋์ผ ์ ์๋ค.
โข
์ฌ์ฌ์ฉ์ฑ
โฆ
๋น์ฆ๋์ค ๋ก์ง ์์ธ ์ฒ๋ฆฌ๋ฅผ Service์์ ์ํํ๋ฉด ๋์ผํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฉํ๋ ์ฌ๋ฌ Controller์์ ์ผ๊ด๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
โฆ
์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ํฅ์์ํค๊ณ ์ค๋ณต ์ฝ๋๋ฅผ ์ค์ด๋ ๋ฐ ํจ๊ณผ์ ์ด๋ค.
โข
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ
โฆ
Service์์ ๋ฐ์ดํฐ ์กฐ์ ๊ด๋ จ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
โฆ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์ธ๋ถ ์์คํ
๊ณผ์ ์ํธ์์ฉ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
โข
๋ ๋์ ํ
์คํธ ๊ฐ๋ฅ์ฑ
โฆ
Service ๊ณ์ธต์์ ๋น์ฆ๋์ค ๋ก์ง ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด ๋จ์ ํ
์คํธ๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
โฆ
๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ Service ๋ฉ์๋๋ฅผ ํ
์คํธํ ๋ ์์ธ ์ํฉ์ ์ฝ๊ฒ ์๋ฎฌ๋ ์ด์
ํ๊ณ ๊ฒ์ฆํ ์ ์๋ค.
[Spring]40 Controller-Service ์์ธ์ฒ๋ฆฌ์ ๊ณ์ธต ์ ํ ๊ถ์ฅ์ฌํญ๊ณผ ๊ทธ ์ด์
์ ์ฝ ์กฐ๊ฑด(Constraint)
์ ์ฝ ์กฐ๊ฑด(constraint)์ด๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์งํค๊ธฐ ์ํด, ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ๋ฐ์ ๋ ์คํ๋๋ ๊ฒ์ฌ ๊ท์น์ ์๋ฏธํ๋ค.
์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ CREATE ๋ฌธ์ผ๋ก ํ
์ด๋ธ์ ์์ฑํ ๋๋ ALTER ๋ฌธ์ผ๋ก ํ๋๋ฅผ ์ถ๊ฐํ ๋๋ ์ค์ ํ ์๋ ์๋ค.
NOT NULL
โข
NULL ๋นํ์ฉ
โข
์ค๋ณต๊ฐ ํ์ฉ์ปฌ๋ผ์ ํ์ ํ๋ํ ์ํฌ ๋ ์ฌ์ฉ.NOT NULL ์ ์ฝ์กฐ๊ฑด ์ค์ ์ ํด๋น ์ปฌ๋ผ์๋ ๊ผญ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด์ผ ํจ.
โข
NOT NULL ์ ์ฝ ์กฐ๊ฑด์ CREATE ๋ฌธ์ผ๋ก ํ
์ด๋ธ์ ์์ฑํ ๋๋, ๋์ค์ ALTER ๋ฌธ์ผ๋ก ์ถ๊ฐํ ์๋ ์๋ค.
UNIQUE
โข
๋ฐ์ดํฐ์ ์ ์ผ์ฑ์ ๋ณด์ฅ(=> ์ค๋ณต๋๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ์ ์์)ํ๊ณ , ์๋์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์์ฑ.
โข
unique์ nullํ์ฉํ์ง๋ง, primary key๋ nullํ์ฉ ์ํจ
โข
unique์ ํ๋์ ํ
์ด๋ธ์ ์ฌ๋ฌ๊ฐ ์ฌ ์ ์์ง๋ง, primary key๋ ํ๋๋ง ์กด์ฌ
โข
UNIQUE ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ๋ฉด, ํด๋น ํ๋๋ ์๋์ผ๋ก ๋ณด์กฐ ์ธ๋ฑ์ค(INDEX)๋ก ๋ง๋ค์ด์ง.
โข
๋ง์ผ ์ ์ฝ ์กฐ๊ฑด์ ์ด๋ฆ์ ์ค์ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํด๋น ์ ์ฝ ์กฐ๊ฑด์ ์ญ์ ํ ์ ์๋ค.
[Spring][JPA]37 ์ ์ฝ์กฐ๊ฑด(Constraint)์ ๋ํ ์ ๋ฆฌ
Spring Security Framework?
'Spring Security' ํ๋ ์์ํฌ๋ Spring ์๋ฒ์ ํ์ํ ์ธ์ฆ ๋ฐ ์ธ๊ฐ๋ฅผ ์ํด ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํด ์ค๋ค.
๋น์ฐํ ํ๋ ์์ํฌ๋ก์จ์ ๊ธฐ๋ฅ ๊ตฌํ์ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด ๋ชฉํ์ง๋ง, ๊ทธ ๊ธฐ๋ฅ๋ค์ด ์๋น์ค์ ์ธ์ฆ/์ธ๊ฐ ๋ถ๋ถ, ๊ณง ๋ก๊ทธ์ธ, ํ์ ๊ฐ์
๋ฑ์ ์ง์ค ๋์ด ์๋ ํ๋ ์์ํฌ๋ค. ๋์ ๋ฐฉ์์ ๋์ผํ๊ฒ Bean์ผ๋ก ๋ฑ๋ก๋๋ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์์ฝ๊ฒ ์ด๋
ธํ
์ด์
์ด๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ํตํด์ ๊ตฌํ ํ๊ฒ ๋๋ค.
์ค์ ๋ก ํด๋น ๋ถ๋ถ์ ์๊ฐ๋ณด๋ค ๋ง์ ๊ฐ๋ฐ์ ์๊ณ ๋ฅผ ๋์ด ์ค๋ค. ๋ง์น 'Spring' ํ๋ ์์ํฌ๊ฐ ์น ์๋ฒ ์ ๋ฐ์ ์ธ ๊ตฌํ์ ํธ์๋ฅผ ์ ๊ณตํด ์ฃผ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณด์๊ณผ ๋ฐ์ ํ ์ธ์ฆ/์ธ๊ฐ ๋ถ๋ถ์ ์ฒ๋ฆฌํด ์ฃผ๋ฉด์ ๊ฐ๋ฐ์์ ์ค์, ๋ก์ง์ ๋ณต์ก์ฑ ๋ฑ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํด์ฃผ๊ณ ์ค์ ๋น์ง๋์ค ๋ก์ง ๊ฐ๋ฐ์ ๋ ์ง์ค ํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ค.
[Spring]36_1
Spring Security ํ๋ ์์ํฌ๋? [์ถ๊ฐ์ ๋ฆฌํ์]
ํด๋น ๋ถ๋ถ์ ์ค์ํ ๋ถ๋ถ์ด๊ธฐ๋ ํ๊ณ ,
์กฐ๊ธ ์ ๋ฆฌํ ๊ฒ์ด ๋ง์์ ์ฐ์ ์ง๋๋ฅผ ๋ง์ถ๊ธฐ ์ํด ์ฃผ๋ง์ ๋ด ํ๋ก์ ํธ์์ ๊ตฌํ์ ์ฌ์ค์ตํ๋ฉด์ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
Spring Security๋ฅผ ํตํ ๋ก๊ทธ์ธ ๋ฐฉ์
ํต์ฌ์ ์ธ ๋ถ๋ถ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์ ํ์ฌ Login ๊ธฐ๋ฅ์ ์ํํด์ฃผ๋ฉฐ ๋ค์ํ ์ธ์ฆ/์ธ๊ฐ ๊ธฐ๋ฅ ๋ค์ ์์ฝ๊ฒ ์ฌ์ฉ ํ ์ ์๋๋ก ๊ตฌํ๋์ด ์๋ค๋ ์ ์ด๋ค.

[Spring]36_2
Spring Security with JWT ๋ก๊ทธ์ธ ๋ฐฉ์ ๊ตฌํ [์ถ๊ฐ์ ๋ฆฌํ์]
Load more


