Spring Boot
Spring Framework๋ฅผ ๋ณด๋ค ์์ฝ๊ฒ ํ์ฉํ ์ ์๊ฒ ์ง์ํ๋ ๊ธฐ์
- Spring Framework๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- ์ค์ , ์์กด์ฑ ๊ด๋ฆฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋ชจ๋ํฐ๋ง, ์๋ฒ์ ์คํ ๋ฑ์ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋ค.
* Spring Boot์ ์ฃผ์ ๊ธฐ๋ฅ
- ์ค์ ๊ฐํธํ๋ฅผ ์ํ Auto Configuration
- ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ Starter Project
- ๋ฐฐํฌ ํ๋ก์ธ์ค ๊ฐ์ํ๋ฅผ ์ํ Embedded WAS
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ํฐ๋ง์ ์ํ Actuator
* SW ์ํคํ ์ณ๋?
: SW์ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ๊ฒ์ผ๋ก SW๋ฅผ ๊ตฌ์ฑํ๋ ์ฃผ์ ์์๋ค๊ณผ ์์๋ค์ ๊ด๊ณ๋ฅผ ์ ์ํ ๊ฒ
๊ทธ ์ค ์น ์๋น์ค ๊ฐ๋ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ํจํด์ธ ๊ณ์ธตํ ์ํคํ ์ณ ํจํด์ ๋ํด ๊ฐ๋จํ ์์๋ณด์.
๊ณ์ธตํ ์ํคํ ์ณ ํจํด์ SW๋ฅผ ์๋ก ๋ค๋ฅธ ์ญํ ์ ํ๋ 3~4๊ฐ์ ๊ณ์ธต์ผ๋ก ๊ตฌ๋ถํ ํจํด์ด๋ค.
- Presentation Layer
- Application Layer
- business Layer
- Data Access Layer
๋ํ ์ด ํจํด์ ๊ณ์ธต ๊ฐ์ ํธ์ถ์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํ๋ ฅํ์ฌ ์ ์ฒด ์น ์๋น์ค๋ฅผ ๊ตฌ์ฑํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด
Client์์ ์์ฒญํ๋ฉด ๊ทธ ์์ฒญ์ ์ฒ์ ๋ฐ๋ ๊ณ์ธต์ Presentation Layer์ด๋ค.
→ ๊ทธ๋ฆฌ๊ณ Application Layer๋ก, ๋ Data Access Layer๋ก ์์ฒญ์ ์ ๋ฌํ ํ Data Access Layer๋ DB์ ์ ๊ทผํ๋ค.
→ ๊ทธ ๋ค์ DB์์ Database๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๊ทธ Database๋ฅผ ์ญ๋ฐฉํฅ์ผ๋ก Data Access Layer → Application Layer → Presentation Layer๋ก ์ ๋ฌํ ํ, ์ต์ข ์ ์ผ๋ก Client์๊ฒ ์ ๋ฌ ํ๋ ๊ตฌ์กฐ์ด๋ค.
Spring Boot์์๋ Presentation Layer๋ Controller, Application Layer๋ Service, Data Access Layer๋ Repository๋ผ๋ ์ฉ์ด๊ฐ ์ฌ์ฉ ๋๋ค.
Spring Controller
- ๊ณ์ธตํ ์ํคํ ์ณ์ Presentation Layer์ ํด๋นํ๋ค.
- Client์ ์์ฒญ์ ๋ฐ๊ณ , Application Layer ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ฉฐ, Client์ ์ต์ข ์๋ต์ ํ๋ ์ญํ ์ด๋ค.
Spring Controller๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ 3๊ฐ์ ๊ธฐ๋ณธ Annotation์ด ์ฌ์ฉ ๋๋ค.
1. @Controller, 2. @RestController
→ Controller ์ญํ ์ ํ๋ ํด๋์ค๋ฅผ ์ง์ ํ๋ ๊ฒ์ผ๋ก, ํด๋์ค ์๋จ์ ๋ช ์ํ๋ค.
3. @RequestMapping
→ ํน์ Request๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ๊ฒ์ผ๋ก, ํด๋์ค ๋๋ ๋ฉ์๋ ์๋จ์ ๋ช ์ํ๋ค.
* Annotataion์ด๋?
→ Java ์์ค์ฝ๋์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ผ๋ก, @๋ก ์์ํ๋ฉฐ ํด๋์ค, ๋ฉ์๋, ๋ฉค๋ฒ๋ณ์, ํ๋ผ๋ฏธํฐ ๋ฑ์ ๋ถ์ฐฉ ๊ฐ๋ฅํ๋ค.
· Annotation์ 3๊ฐ์ง ์ ํ
- ์๋ฐ ์ปดํ์ผ๋ฌ์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
- SW ํด์ ์ํด ์ฌ์ฉ๋์ด ์ฝ๋ ์์ฑ์ด๋ ์ถ๊ฐ ์์ ์ ์งํํ๋ค.
- run-time ์ ํน์ ๋์์ ์ถ๊ฐ์ ์ผ๋ก ์คํํ๋ค.
* Spring Framework๋?
→ ์ฝ์๋ Annotation์ ์ธ์ํ์ฌ ํน์ ์ ์ ์ ์ํํ๋ ๊ฒ
โป @Controller VS @RestController
· ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ํ๋ ๋ฑ ๋๋ถ๋ถ์ ๋์์ ์ ์ฌํ๋ค.
But, ์๋ตํ๋ ํํ๊ฐ ๋ค๋ฅด๋ค.
- Controller: view๋ฅผ ์๋ต(html ํ์ผ ๋ฑ)
- RestController: data๋ฅผ ์๋ต(๋ฌธ์์ด, Json, xml ๋ฑ)
@RestController๋ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์๋ต๋ฐ๊ณ ,
@Controller์์ ๋ฌธ์์ด "hello"๋ htmlํ์ผ(view)์ ์ด๋ฆ์ ์๋ฏธํ์ฌ hello.html์ด๋ผ๋ ๋ฌธ์๊ฐ ์๋ต๋์๋ค
โป @RequestMapping
· @RequestMapping์ด ๋ถ์ด ์๋ ๋ฉ์๋๋ Client์ ํน์ ์์ฒญ์ด ์์ ๋ Spring Framework์ ์ํด ํธ์ถ ๋๋ค.
๊ทธ๋ผ RequestMapping์ด ๋ถ์ด ์๋ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ฐ ์ผ ๋๋ ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋ ๊น?
Spring Controller์ ๋ฉ์๋๋ค์ URI์ ๋ฐ๋ผ ํธ์ถ์ด ๊ฒฐ์ ๋๋ค.
(URI(Uniform Resource Identifier)๋ URL๊ณผ ์ ์ฌํ ๊ฐ๋ ์ผ๋ก ํน์ ํ ์์์ ์ ๊ทผํ๊ธฐ ์ํ ์ด๋ฆ ๋๋ ์ฃผ์๋ฅผ ๋งํ๋ค.)
๊ธฐ๋ณธ ๋๋ฉ์ธ์ ์ด์ด์ง๋ '/path' ๋ค์ ์ํด ๊ฒฐ์ ์ด ๋๋ค. (ex. http://localhose:8080/user)
RequestMapping Annotation์ URI Path ์ ๋ณด๋ฅผ ๋ช ์ํ๋ค. → ex. @RequestMapping(value = "/user")
๋ฐ๋ผ์
๊ธฐ๋ณธ ๋๋ฉ์ธ์ ์ด์ด์ง๋ /๋ค์ path ์ ๋ณด์ ์ํด ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋ ์ง Spring Framework๊ฐ ๊ฒฐ์ ํ๋ค.
* URI (Uniform Resource Identifier)
URI๋ ์์ฒญํ๋ ์์์ ์ข ๋ฅ์ ๋ฐ๋ผ ์ด๋ฆ์ ์ ํ๋ค.
- www.codepresso-blog.com/user → user์ ๋ณด๋ฅผ ์์ฒญํ๊ธฐ ์ํ ์ด๋ฆ
- www.codepresso-blog.com/posts → ๊ธ ๋ชฉ๋ก ๋ฑ์ ์์ฒญํ๊ธฐ ์ํ ์ด๋ฆ ๋ฑ์ผ๋ก ๋ช ํํ๊ฒ ์ด๋ฆ์ ์ ํด์ผ ํ๋ค.
๋ํ ๊ณ์ธต ๊ด๊ณ๋ก ํํ์ด ๊ฐ๋ฅํ๋ฉฐ, ' / '๋ก ๊ณ์ธต์ ๊ตฌ๋ถํ๋ค.
- www.codepresso-blog.com/user/paid
- www.codepresso-blog.com/user/enterprise ๋ฑ
Naming ๊ท์ฝ
- ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๊ณ , ๋ช ์ฌ ํํ๋ก ์์ฑํ๋.
- ๋ ๋จ์ด ์ด์ ์ฐ๊ฒฐ ๋ ๊ฒฝ์ฐ ' - '๋ฅผ ์ฌ์ฉํ๋ค.
- ์๋ฏธ ์๋ ์ด๋ฆ์ผ๋ก ์ผ๊ด์ฑ ์๊ฒ ์์ฑํ๋ค.
โป HTTP API vs REST API
- HTTP API
: HTTP(s)๋ฅผ ํ์ฉํ์ฌ ์๊ฒฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ API
- REST API (REpresentational State Transfer API)
: Roy Fielding์ด ์ ์ ํ ๋ ผ๋ฌธ์ ์๊ฐ๋ ๊ฐ๋ ์ผ๋ก, ์น ์์์ ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ ์ํคํ ์ณ ์คํ์ผ
→ @RestController Annotation์ REST API, HTTP API๋ฅผ ์ํ ํด๋์ค๋ฅผ ๋ช ์ํ๋ ๊ฒ์ด๊ณ , ํด๋์ค ๋ด์ @RequestMapping์ด ๋ถ์ ๊ฐ๋ณ ๋ฉ์๋๋ค์ด ํ๋์ REST API, HTTP API์ด๋ค.
" Request ํ๋ผ๋ฏธํฐ "
Client๊ฐ Server์ ์์ฒญ(Request)์ ํ ๋ ์ถ๊ฐ์ ์ผ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ
Spring Framework๋ Request ํ๋ผ๋ฏธํฐ๋ฅผ (@Request Mapping์ด ๋ถ์)๋ฉ์๋์ ํ๋ผ๋ฏธํฐ์ ์ ์ฅํ๋ค
Requestํ๋ผ๋ฏธํฐ๋ 2๊ฐ์ง ์ ํ์ด ์๋ค.
1. Query String
- URI์ ํ๋ผ๋ฏธํฐ์ ์์ญ์ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๋ค.
( URI์ ์ด์ด์ง๋ '?' ๋ค์ key1=value1&key2=value2&··· ํํ๋ก ์์ฑ ๋จ)
- key๋ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ, value๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ
(ex. https://www.google.com/search ?q=codepresso&sourceid=chrome&ie=UTF-8)
- ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ @RequestParam Annotation์ ์ฌ์ฉํ๋ค.
- name ์์๋ Query String์ key์ ๋งคํ๋๋ค.
* @RequestParam์ ์์
- name: Query string์ key์ด๋ค. key์ ๋ณ์๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ ์๋ต์ด ๊ฐ๋ฅํ๋ค.
- required: ํ์ ์ฌ๋ถ
- defaultValue: ๋ฐ์ดํฐ๊ฐ ์์ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ธํ ๋๋ ๊ธฐ๋ณธ ๊ฐ
2. Path Parameter
- URI์ ์ผ๋ถ๋ก ํ๋ผ๋ฏธํฐ ๊ฐ์ ์ฌ์ฉํ๋ค.
(domain/user/1 , domain/user/3/post/27 → ํ๋์ซ์๊ฐ ํ๋ผ๋ฏธํฐ ๊ฐ)
( ex. http://brunch.co.kr/@thinkabout/199
→ @~๋ user์ ๊ณ์ , 199๋ ๊ณ์ ์ ๊ธ id๋ก thinkabout user์ 199๋ฒ ๊ธ์ ์์ฒญํ๋ค๋ ์๋ฏธ )
- @RequestMapping value URI์ { }๋ก Path Param์์ ํ์ํ๋ค.
- ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์ @PathVariable Annotation์ ์ฌ์ฉํ๋ค.
- ์ ํ์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ Path Param์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
- ์ ์์ ๋ก ์๋ฅผ ๋ค๋ฉด
http://localhost:8080/user/admin/id/100 → ์ถ๋ ฅ๊ฐ: You requested admin-100 user
โป Path Parameter vs Query String ์ธ์ ์ฌ์ฉํ ๊น?
- ์ผ๋ฐ์ ์ธ ์ถ์ฒ ์ฌํญ
(Path Param: ํน์ ์์์ ์์ฒญํ๋ ๊ฒฝ์ฐ, Query String: ์์์ ๋ํ ์ ๋ ฌ์ด๋ ์ถ๊ฐ ํํฐ๋ง์ ์ํ ๋ฐ์ดํฐ)
→ ex. https://codepresso.kr/courses/spring?order=latest
- ํ์ ๋ฐ์ดํฐ๋ Path Param์ผ๋ก, ์ ํ์ ๋ฐ์ดํฐ๋ Query String์ ์ฌ์ฉํ๋ผ
(Path Param์ด ํฌํจ ๋ URI๋ Client๊ฐ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ๋น์ฉ์ด ๋์ง๋ง,
Query String์ ์๋์ ์ผ๋ก ํธํ๊ฒ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค)
โซ Tip
- spring initializr
: Spring Boot ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๊ฒ ์ง์ํ๋ ์ฌ์ดํธ
์ฝ๋ํ๋ ์ Java ์น ๊ฐ๋ฐ ์ฒดํ๋จ ํ๋ ์ค 'Spring Boot ์น ๊ฐ๋ฐ ์
๋ฌธ' ์ด๋ฌ๋ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ฑํ์์ต๋๋ค :)
์ฝ๋ํ๋ ์ URL: https://www.codepresso.kr/
'๐ ๊ธฐํ > ์ฝ๋ํ๋ ์ ์ฒดํ๋จ_BE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL] SQL ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ํ์ฉ (0) | 2022.02.04 |
---|---|
[SQL] ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Workbench ์ฌ์ฉ (0) | 2022.02.03 |
HTML๊ณผ CSS์ ๊ธฐ์ด ๊ฐ๋ (0) | 2022.01.28 |
Clean Control Structure | Refactoring (0) | 2022.01.24 |
Clean Comment | Formatting (0) | 2022.01.24 |