๐๏ธ 2024 ๋ฒํด๋ฆฌ์ฆ Java SpringBoot ์ธํฐ๋ทฐ ์ง๋ฌธ (2)
Join์ ๋ฌด์์ธ๊ฐ์? Join์ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ๊ธฐ ์ํ ๊ฐ๋ ์ ๋๋ค. ๊ณต์ field๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์์ ๊ด๋ จ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ์๋ค: * ๊ณ ๊ฐ ํ ์ด๋ธ์ ์ด๋ฆ, ID์ ๊ฐ์ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. * ์ฃผ๋ฌธ ํ ์ด๋ธ์ ๊ณ ๊ฐ ID(๊ณ ๊ฐ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐ๋)๋ฅผ ํฌํจํ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ์์ ํ ์ ๋ณด๋ฅผ ์ํด, ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์ฃผ๋ฌธ ์ ๋ณด์ ๊ฒฐํฉํด ๋ณด์ฌ์ฃผ๊ธธ ์ํ ๊ฒ์ ๋๋ค. ์ด๋ ์กฐ์ธ์ ์ฌ์ฉํฉ๋๋ค. * Inner Join: ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์กฐ์ธ์ ๋๋ค. ๋ ํ ์ด๋ธ ๋ชจ๋์ ํฌํจ๋ ๋ด์ฉ๋ง ๋ฐํํฉ๋๋ค. * Left Join: ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ด ํฌํจ๋ฉ๋๋ค. ์ผ์นํ์ง ์๋ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ํ์ null ๊ฐ์ ๊ฐ์ง๋๋ค. * Right Join: ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ผ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ด ํฌํจ๋ฉ๋๋ค. ์ผ์นํ์ง ์๋ ์ผ์ชฝ ํ ์ด๋ธ์ ํ์ null ๊ฐ์ ๊ฐ์ง๋๋ค. * Full Join: ์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ์ด ์๋์ง์ ๊ด๊ณ์์ด ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ด ๊ฒฐํฉ๋ฉ๋๋ค. ์ผ์นํ์ง ์๋ ํ์ ํด๋น ์ด์ null ๊ฐ์ ๊ฐ์ต๋๋ค. ย Primary์ Foreign key์ ์ฐจ์ด์ ์ด ๋ฌด์์ธ๊ฐ์? [Primary Key(๊ธฐ๋ณธ ํค)] * Uniqueness: ํ ์ด๋ธ์ ๊ฐ ํ์ ๊ณ ์ ์๋ณ์๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ฝ๋ ์ค๋ณต์ ๋ฐฉ์งํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฒ์์ด ๊ฐ๋ฅํฉ๋๋ค. * Single Key: ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ํ๋๋ง ๊ฐ์ง ์ ์์ต๋๋ค.ย * Not null: ๊ธฐ๋ณธ ํค ์ด์ ์ผ๋ฐ์ ์ผ๋ก null ๊ฐ์ ํ์ฉํ์ง ์์ต๋๋ค. [Foreign Key(์ธ๋ ํค)] * Relationship Builder: ๋ ํ ์ด๋ธ ๊ฐ์ ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค. ๋ค๋ฅธ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๋ฅผ ์ฐธ์กฐํฉ๋๋ค. * Multiple Keys: ํ ํ ์ด๋ธ์ ์ฌ๋ฌ ๊ฐ์ ์ธ๋ถ ํค๊ฐ ์์ ์ ์์ต๋๋ค. * Nullable: ์ธ๋ถ ํค ์ด์ null ๊ฐ์ ํ์ฉํฉ๋๋ค. ย REST-API๋ ๋ฌด์์ธ๊ฐ์? REST API๋ Representational State Transfer API์ ์ฝ์์ ๋๋ค. ์น API๋ฅผ ์ค๊ณํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์คํ์ผ์ ๋๋ค. ๊ฐ๋จํ ๋งํด, HTTP ์์ฒญ ๋ฐ ์๋ต์ ์ฌ์ฉํ์ฌ ํต์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ผ๋ จ์ ๊ท์น์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ด๊ณ์์ด ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์๋ก ์ฝ๊ฒ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.ย ย ์ธ์ ์บก์ํ์ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋์? ์บก์ํ์ ์ถ์ํ๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ, ์ ์ง ๋ณด์์ฑ ๋ฐ ๋ณด์์ ๊ฐํํ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋๋ค.ย [์บก์ํ] * ๋ฐ์ดํฐ ์จ๊น ๋ฐ ๋ณดํธ: ๊ฐ์ฒด์ ๋ด๋ถ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ณ ์ ํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋น๊ณต๊ฐ๋ก ์ค์ ํ๊ณ ์ ๊ทผํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ณ ์๋ํ์ง ์๋ ์์ ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. * ์ํ ํด๋์ค์์ ๊ณ์ข๊ธ์ก ๋ฐ์ดํฐ๋ฅผ ์บก์ํํ์ฌ ์ ์ถ๊ธ๊ณผ ๊ฐ์ ์ ์ ํ ๋ฐฉ๋ฒ์ ํตํด์๋ง ์ ๊ทผํ๊ฒ ํฉ๋๋ค. [์ถ์ํ] * ๊ธฐ๋ฅ์ ์ง์ค: ์ถ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์จ๊ธฐ๊ณ ์ธํฐํ์ด์ค ๋๋ ์ถ์ํ ํด๋์ค๋ฅผ ํตํด ํ์ ๊ธฐ๋ฅ๋ง ๋ ธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ๊ธฐ๋ณธ ์ธ๋ถ ๊ตฌํ์ ๋ํ ๊ฑฑ์ ์์ด ๊ฐ์ฒด์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. [๊ฒฐ๋ก ] * ์บก์ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ ์ดํฉ๋๋ค. * ์ถ์ํ๋ฅผ ์ด์ฉํ์ฌ "how"๋ณด๋ค "what"์ ์ง์คํฉ๋๋ค. ย Lazy Loading๊ณผ Eager Loading์ ์ค๋ช ํด์ฃผ์ธ์ Hibernate์ ๊ฐ์ ORM ํ๋ ์์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋ ๊ฐ์ง ์ ๋ต์ด Lazy loding๊ณผ Eager loading์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ด๋ จ ๊ฐ์ฒด๊ฐ ๋ก๋๋๋ ์๊ธฐ์ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค. [Lazy Loading(์ง์ฐ ๋ก๋ฉ)] * Delay Loading: ๋ฐ์ดํฐ๋ ๋ช ์์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ๊ฒ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ์ ํ์ ํด๋ฆญํ ๋๋ง ์ ํ ์ค๋ช ์ด๋ ๋ฆฌ๋ทฐ์ ๊ฐ์ ์ ๋ณด๊ฐ ๋ก๋ฉ๋๋๋ก ํฉ๋๋ค. * Performance Benefits: ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ์ ๋ํ ๋ถํ์ํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฉ์งํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. * Potential for Extra Queries: ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ธํด ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ด ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. [Eager Loading(์ฆ์ ๋ก๋ฉ)] * Loads Everything Upfront: ๋ชจ๋ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋จ์ผ ์ฟผ๋ฆฌ์์ ๊ธฐ๋ณธ ๊ฐ์ฒด์ ํจ๊ป ๊ฐ์ ธ์ต๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ง ์๋๋ผ๋ ๋ชจ๋ ์ ํ ์ ๋ณด๊ฐ ๋ชฉ๋ก ํ์ด์ง์ ๋ก๋๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. * Faster Access to Related Data: ๋ฐ์ดํฐ๋ฅผ ์ด๋ฏธ ๋ถ๋ฌ์์ผ๋ฏ๋ก ๊ด๋ จ ์ ๋ณด์ ์ ๊ทผํ ๋ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ ๋๋ถ๋ถ์ ์ฌ์ฉํด์ผ ํ๋ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ํฅ์๋ ์ ์์ต๋๋ค. * Potentially Slower Initial Load: ํ์ํ์ง ์์ ์๋ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค. ย @GetMapping๊ณผ @PostMapping์ ์ธ์ ์ฌ์ฉํ๋์? [@GetMapping] * HTTP GET ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์์ ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. * ๋ฆฌ์์ค ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ * ํน์ ๋ฆฌ์์ค์ ์ธ๋ถ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ * ๊ฒ์ ๋๋ ํํฐ๋ง ์์ฒญ ์ฒ๋ฆฌย @Controller public class ProductController { @GetMapping("/products") public List getAllProducts() { // Logic to retrieve all products from the database } } [@PostMapping] * HTTP POST ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋์ ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์์ฑ ๋๋ ์ ๋ฐ์ดํธ ๋ชฉ์ ์ผ๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. * ์ ๋ฆฌ์์ค ์์ฑ * ๊ธฐ์กด ๋ฆฌ์์ค ์ ๋ฐ์ดํธ * ๋ฆฌ์์ค ์ญ์ @Controller public class ProductController { @PostMapping("/products") public Product createProduct(@RequestBody Product product) { // Logic to save the new product to the database } } ย ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ํ ์์ธ ์ฒ๋ฆฌ ๊ท์น์๋ ์ด๋ค ๊ฒ์ด ์๋์? [Same or Subclass Exception] * ์ํผํด๋์ค์ ๋ฉ์๋๊ฐ checked exception์ ์ ์ธํ ๋, ์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๋ ๋์ผํ ์์ธ๋ฅผ ์ ์ธํ๊ฑฐ๋ ํด๋น ์์ธ์ ํ์ ํด๋์ค๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ์ ํด๋์ค์์ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. class SuperClass { public void doSomething() throws IOException { // ... } } class SubClass extends SuperClass { @Override public void doSomething() throws FileNotFoundException { // Subclass of IOException // ... } } [No Checked Exception] * ๋ง์ฝ ์ํผํด๋์ค ๋ฉ์๋๊ฐ ์์ธ๋ฅผ ์ ์ธํ์ง ์์ผ๋ฉด, ํ์ ํด๋์ค์ ๋ฉ์๋๋ checked exception์ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, unchecked exception์ ์ ์ธํ ์ ์์ต๋๋ค. class SuperClass { public void doSomething() { // ... } } class SubClass extends SuperClass { @Override public void doSomething() throws IOException { // Not allowed (superclass doesn't throw IOException) // ... } } ย Spring MVC ํ๋ก์ฐ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์ Spring MVC๋ MVC ์ํคํ ์ฒ ํจํด์ ๋ฐ๋ฅด๋ฉฐ, ์ด ํจํด์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง, ๋ฐ์ดํฐ ํ๋ ์ ํ ์ด์ ๋ฐ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ ๋ถ๋ฆฌํ์ฌ ์ ์ง ๋ณด์์ฑ๊ณผ ํ ์คํธ์ฑ์ ๋์ ๋๋ค. ย 1. Client Request: ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น ํ๋ก๊ทธ๋จ๊ณผ ์ํธ ์์ฉํ์ฌ ์๋ฒ์ ํน์ URL์ ๋ํ HTTP ์์ฒญ์ ๋ ๋ฆฝ๋๋ค. 2. DispatcherServlet Intercept: DispatcherServlet์ด Spring MVC์ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ์ญํ ์ ํ๋ฉฐ, ์น ์ปจํ ์ด๋(Tomcat/Jetty)๋ก๋ถํฐ ๋ค์ด์ค๋ ๋ชจ๋ HTTP ์์ฒญ์ ์์ ํฉ๋๋ค. 3. Handler Mapping: DispatcherServlet์ด ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ผ๋ก RequestMappingHandlerMapping์ผ๋ก ๊ตฌํ๋๋ HandlerMapping์ ์ฐธ์กฐํฉ๋๋ค.ย 4. Handler Selection: HandlerMapping์ ์์ฒญ URL ๋ฐ HTTP ๋ฉ์๋ ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์ ํ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ฐ ๋ฉ์๋๋ฅผ ์๋ณํฉ๋๋ค. 5. Controller Invocation: DispatcherServlet์ ์คํ๋ง ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ์ฌ ์๋ณ๋ ์ปจํธ๋กค๋ฌ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. (์์ง ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ์) ๊ทธ๋ฐ ๋ค์ ์ปจํธ๋กค๋ฌ์์ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค. 6. Model Population: ๋ฉ์๋ ์์์ ๋น์ฆ๋์ค ๋ก์ง์ด ์คํ๋ฉ๋๋ค.ย 7. View Resolution: ๋ชจ๋ธ์ด ์ฑ์์ง๋ฉด ์ปจํธ๋กค๋ฌ๋ ์๋ต์ ๋ ๋๋ง ํ ๋ทฐ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ViewResolver๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ ๋ทฐ ํ ํ๋ฆฟ์ ์ ์ ํฉ๋๋ค.ย 8. View Rendering: ViewResolver๋ view name์ ๊ธฐ์ค์ผ๋ก ๋ทฐ ํ ํ๋ฆฟ์ ์ฐพ์ต๋๋ค. ๋ชจ๋ธ ๊ฐ์ฒด๋ ์ต์ข HTML ์๋ต์ ๋ ๋๋ง ํ๊ธฐ ์ํด ๋ทฐ ์์ง(JSP/FreeMarker)์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋ ๋๋ง ๋ HTML ์๋ต์ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ๋ก ๋ค์ ์ ์ก๋ฉ๋๋ค.ย ย ๋ฒ์ญ: [https://ducktopia.tistory.com/118] ์๋ฌธ: