CMS

<aside> ๐Ÿ’ก

ํ˜•์ƒ๊ด€๋ฆฌ

<aside> ๐Ÿ’ก

๊ธฐ๋ณธ์„ค์ •

</aside>

[๋ชจ๋“  Dependency] // 24.11.20.now

to Top

[์ฃผ์š” Package]
import org.springframework.stereotype 
//์• ๋…ธํ…Œ์ด์…˜, component์Šค์บ”/bean๋“ฑ๋ก ์ง€์› ex: @Component, @Repository, @Service, @Controller

import org.springframework.context.ApplicationContext;
//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ํฌํ•จ, bean๊ตฌ์„ฑ๊ด€๋ฆฌ

import org.springframework.beans.factory.annotation.Autowired;
//Bean๊ด€๋ฆฌ/์˜์กด์„ฑ ์ฃผ์ž… ์ง€์›

import org.springframework.core.io.Resource;
//์ฝ”์–ด์œ ํ‹ธ/๊ณตํ†ต๊ธฐ๋Šฅ ์ œ๊ณต

import org.springframework.aop.framework.ProxyFactory;
//AOP(Aspect-Oriented Programming) ๊ธฐ๋Šฅ์ œ๊ณต

import org.springfamework.jdbc.core.JdbcTemplate;
//๊ฐ„ํŽธํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ์„ ์œ„ํ•œ JDBC ์ถ”์ƒํ™” ๊ณ„์ธต ์ œ๊ณต

import org.springframework.transaction.annotation.Transactional;
//ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์ง€์›

import org.springframework.web.bind.annotation.RequestMapping;
//์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์ง€์›

import org.springframework.security.core.userdetails.UserDetailsService;
//๋ณด์•ˆ ๊ด€๋ จ ๊ธฐ๋Šฅ ์ œ๊ณต

import org.springframework.boot.SpringApplication;
//์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ •/์‹คํ–‰์„ ๋•๋Š” Spring Boot ์ง€์›

to Top

<aside> ๐Ÿ› 

[ ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ์ž‘๋™์›๋ฆฌ ]

@Controller โ†’ @Service โ†’ @Repository +@Component โ†’ @autowired(DI)

  1. @SpringBootApplication : ์Šคํ”„๋งMVC๋Š” ๊ฑฐ๋Œ€ํ•œ switch()๋ฌธ ์˜๋ก€ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ๊ทธ๋ ‡๋“ฏ ์Šคํ”„๋งMVC์˜ main()ํ”„๋กœ์„ธ์Šค + ๋ฃจํ”„๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์ง€์†๋™์ž‘์€ ํ”„๋ ˆ์ž„์›Œํฌ ์•„๋ž˜๋กœ ์€๋‹‰ํ•œ ์ƒํƒœ, ๊ฐœ๋ฐœ์ž๋Š” ์Šคํ”„๋ง์„ ๊ฑฐ๋Œ€ํ•œ switch()๋ฌธ์ด๋ผ๊ณ  ๋ณด๊ณ  ๊ฐœ๋ฐœ์„ ํ•˜๊ฒŒ ๋จ

  2. @Controller (ํด๋ž˜์Šค) / @GetMapping (๋ฉ”์„œ๋“œ) ์ด ์Šค์œ„์น˜๋ฌธ์€ View์—์„œ ์™ธ๋ถ€์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ์ปจํŠธ๋กค(HTML์ƒ ํŠน์ •URLํ˜•ํƒœ์˜ ์ธ์ž)์„ ๋ณด๋‚ธ๋‹ค ๊ฐ€์ •-์„ค๊ณ„๋จ,

์ด๊ฑธ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ํด๋ž˜์Šค๋ฅผ ํŠน๋ณ„ํžˆ @Controller๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด, ๋ฏธ๋ฆฌ ์•ฝ์†๋œ ๊ด€๋ จ ๋ฐ์ดํ„ฐํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์Šคํ”„๋ง์ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋งด๋ฒ„ํ•จ์ˆ˜์ค‘์— ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ƒํ™ฉ์—์„œ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ธํ’‹ํ•ด์ค€๋‹ค. (์˜์กด์„ฑ์ฃผ์ž…DI : ์•„๋ž˜์„ค๋ช…..)

๊ทธ๋ฆฌ๊ณ  ์ด View๋“ค์€ ๋ฌธ์ž์—ด์˜ ๊ณ ์œ  ์ฃผ์†Œ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, @GetMapping("๋Œ€์ƒ์ฃผ์†Œ") ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ•ด๋‹น ์ปจํŠธ๋กค๊ณผ ๋งคํ•‘๋  ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•จ

  1. @Component (ํƒ€์ž…ํด๋ž˜์Šค) / @Service (ํƒ€์ž…ํด๋ž˜์Šค-๋น„์ฆˆ๋‹ˆ์Šค๋กœ์งํŠนํ™”) Model๋“ฑ๊ณผ ๊ฐ™์ด ๋ฏธ๋ฆฌ์ •์˜๋œ ํƒ€์ž…์ด ์•„๋‹Œ ์ปค์Šคํ…€ํƒ€์ž…์„ ์˜์กด์„ฑ์ฃผ์ž…์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, @Component,@Service์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด bean(์Šคํ”„๋ง์— ๋“ฑ๋ก๋œ ํƒ€์ž…์˜ ๊ด€๋ฆฌ ๊ฐ์ฒด)์œผ๋กœ ๋“ฑ๋ก์„ ์œ ๋„

  2. @Repository

์š”์•ฝ: ํฌ๊ฒŒ ๋ณด๋ฉด, View์˜ ๊ฐœ๋ณ„์ฃผ์†Œ์— ๋Œ€์‘ํ•  Controllerํด๋ž˜์Šค์™€ ํ•˜์œ„์˜Mapping๋ฉ”์„œ๋“œ๋“ค์„ ์„ ์–ธํ•ด๋‘๋ฉด, ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ์‹คํ–‰ํ• ์ง€๋ง์ง€ ๊ด€๋ฆฌ, ๊ฐœ๋ฐœ์ž์˜ ์ง์ ‘์ ์ธ ํ”„๋กœ์„ธ์‹ฑ์€ ์—†๋‹ค. โ†’ ๊ฑฐ๋Œ€ switch๋ฌธ ๋А๋‚Œ

๋˜ํ•œ, Model์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์š” ๋ฐ์ดํ„ฐํด๋ž˜์Šค ๋˜ํ•œ Controller-Model๊ณผ ๊ฐ™์ด ์‚ฌ์ „์ค€๋น„๋œ ๊ฒƒ๋“ค์ด ์žˆ์–ด, ๊ฐœ๋ฐœ์ž๋Š” ์„ค๊ณ„/์„ ์–ธํ•˜์ง€ ์•Š๊ณ , ํ˜•์‹๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•˜๊ธฐ๋งŒํ•˜๋ฉด, ์‚ฌ์šฉ ๋ฐ ๊ด€๋ฆฌ๋„ ์Šคํ”„๋ง์ด ์•Œ์•„์„œ ํ•จ. โ†’ ๊ฒฐ๊ตญ MVC์˜ ๋ผˆ๋Œ€์ค‘์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ์—†๋‹ค;;; V์™€ C์˜ ๋‚ด์šฉ ๊ทธ๋ฆฌ๊ณ  custom-M ๋ฟ... (+ HTML์€ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ๋Š” 1:1๋งคํ•‘์ด ์•„๋‹Œ, 1์ฃผ์†Œ:์—ฌ๋Ÿฌ๋งคํ•‘ ๊ตฌ์กฐ๊ฐ€ ๋จ)

โ†’ ์˜์กด์„ฑ์ฃผ์ž…DI: ์„ ์–ธํ•œ์  ์—†๋Š” ํƒ€์ž…์ด์ง€๋งŒ ํ˜•์‹๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ƒ์„ฑํ•œ์  ์—†๋Š” ๊ฐ์ฒด์ด์ง€๋งŒ, @์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ๊ด€๋ จ ๊ฐ์ฒด๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ๊ด€๋ฆฌ๋˜๊ณ , ์‹คํ–‰ํ•œ์  ์—†๋Š” ํ•จ์ˆ˜์ด์ง€๋งŒ, @์ปจํŠธ๋กค๋Ÿฌ์— ์˜ํ•ด ์ž๋™์‹คํ–‰๋œ ํ•จ์ˆ˜์—, @GetMappingํ•˜์˜€์„๋ฟ, ๋ช…์‹œ์ ์œผ๋กœ ์ธํ’‹ํ•œ์ ์—†๋Š”๋ฐ ์‹ค์ œ ๊ฐ์ฒด๊ฐ€ ์ธ์ž๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ

</aside>

[ default-bean s ]
<Model> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for ๋ทฐ์— ๋ฐ์ดํ„ฐ์ „๋‹ฌ
public class ExtendedModelMap extends ConcurrentHashMap<String, Object> implements Model {
    // HashMap์„ ์ƒ์†๋ฐ›์€ ModelMap์€ Model์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Œ
    // ์‹ค์ œ model ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์€ ModelMap์—์„œ
}
public: //๋งด๋ฒ„ํ•จ์ˆ˜.. +์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋งด๋ฒ„๋ณ€์ˆ˜๋Š” ์—†๋‹ค
.addAttribute(String key, Object value) : ๋ชจ๋ธ์— ์†์„ฑ์ถ”๊ฐ€
.addAttribute(Object value) : ๋ชจ๋ธ์— ์ด๋ฆ„์—†๋Š” ์†์„ฑ์ถ”๊ฐ€
.addAllAttributes(Map<String, ?> elements) : ๋ชจ๋ธ์— ์—ฌ๋Ÿฌ์†์„ฑ ์ผ๊ด„์ถ”๊ฐ€ by Map
.addAllAttributes(Collection<?> elements) : ๋ชจ๋ธ์— ์—ฌ๋Ÿฌ์†์„ฑ ์ผ๊ด„์ถ”๊ฐ€ by Collection
.mergeAttributes(Map<String, ?> elements) :  ๋ชจ๋ธ์— ์ฃผ์–ด์ง„ ์†์„ฑ ์ผ๊ด„์ถ”๊ฐ€ in Map
.containAtrribute(String key) : ๋ชจ๋ธ์— ํŠน์ • ์†์„ฑ ์กฐํšŒ
.asMap() : ๋ชจ๋ธ์˜ ๋ชจ๋“  ์†์„ฑ ๋ฐ˜ํ™˜ to Map

<HttpServletRequest> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for HTTP์š”์ฒญ
.getParameter(String key) : ์š”์ฒญํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ๊ฐ€์ ธ์˜ด
.getSession() : ์„ธ์…˜ ๊ฐ์ฒด ๋ฐ˜ํ™˜
.getAttributes(String key) : ์š”์ฒญ ์†์„ฑ ๊ฐ€์ ธ์˜ด

<HttpServletResponse> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for HTTP์‘๋‹ต
.setStatus(ins sc) : HTTP์‘๋‹ต์ƒํƒœ์ฝ”๋“œ ์„ค์ •
.addHeader(String key, String value) : ์‘๋‹ตํ—ค๋” ์ถ”๊ฐ€ 
.getWriter() : ์‘๋‹ต๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ์œ„ํ•œ PrintWriter๊ฐ์ฒด ๋ฐ˜ํ™˜

<Principal> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for ์ธ์ฆ์‚ฌ์šฉ์ž์ •๋ณด
.getName() : ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ˜ํ™˜

<SessionState> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for ์„ธ์…˜์™„๋ฃŒ์ƒํƒœ
.setComplete() : ์„ธ์…˜์™„๋ฃŒ์ƒํƒœ ์„ค์ •

<Locale> : InterfaceClass๊ฐ์ฒดํƒ€์ž… for ๋กœ์ผ€์ผ์ •๋ณด
.getLanguage() : ์–ธ์–ด์ฝ”๋“œ ๋ฐ˜ํ™˜
.getCountry() : ๊ตญ๊ฐ€์ฝ”๋“œ ๋ฐ˜ํ™˜

to Top

AOP ๊ณ ์œ ์šฉ์–ด