Spring
์บก์คํค ์ค๊ณ๋ฅผ ํ๋ฉด์ ํด์ํ๊ทธ ๊ธฐ๋ฅ์ ๊ตฌํํ์ด์ผ ํ๋๋ฐ ์ด๋ป๊ฒ ์ค๊ณ๋ฅผ ํด์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋์๋ค..๐ค ๋ด๊ฐ ๊ณ ๋ฏผํ๋ ๊ฒ ๐ธ ๊ธ์ ์ฌ๋ฌ ๊ฐ์ ํด์ํ๊ทธ๋ฅผ ๊ฐ์ง ์ ์๋ค. ๐ธ ํด์ํ๊ทธ๋ ์ฌ๋ฌ ๊ธ์ ์ฌ์ฉ ๋ ์ ์๋ค. ๐ ๊ทธ๋ผ DB ์์
๋ค์์ ๋์ฒ๋ผ N:M ๊ด๊ณ๋ฅผ ์จ์ผ ํ๋...?๋ผ๊ณ ๊ณ ๋ฏผํ์ง๋ง N:M๊ด๊ณ๋ ์ ๋์ ๋์ ๋ ์ฌ์ฉํ๋ฉด ์ ๋๋ค๊ณ ํด์ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค๋ค! โ๏ธ ๋ค๋๋ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ๋จ์ํด์ง๊ณ ํธ๋ฆฌํ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง ์ํฐํฐ์ ์ฌ๋ฌ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ ์ถ๊ฐํ ์นผ๋ผ๋ค์ ๋งคํํ ์ ์๋ค๊ณ ํ๋ค..! ๊ฒฐ๊ตญ @ManyToMany๋ฅผ ์ฌ์ฉํ์ง ๋ชปํจ.. ํด๊ฒฐํ ๋ฐฉ๋ฒ ๐ธ ์ผ๋๋ค, ๋ค๋์ผ ๊ด๊ณ๋ฅผ ๋ง๋ค์! ๐ธ ๋งคํ ์ํฐํฐ๋ฅผ ๋ง๋ค์ด ๊ธ๊ณผ ๋งคํ์ํฐํฐ๋ ์ผ๋๋ค, ๋งคํ์ํฐํฐ์ ํด์ํ๊ทธ๋ ๋ค๋์ผ ๊ด๊ณ๋ก ์ค๊ณํ..
Spring
์ด๋ฏธ์ง๋ dto๋ ๊ฐ์ด ์
๋ ฅ ๋ฐ๊ณ ์ถ์๋ฐ postman์์๋ multipartFile์ ์ด๋ฏธ์ง๋ก dto๋ json์ผ๋ก ๋ฐ๋ก ์
๋ ฅ์ด ๊ฐ๋ฅํ์ง๋ง ์ค์จ๊ฑฐ์์ ์คํํ ๋๋ ํ ๋ฒ์ ์๋ฌ๋ค....๐ญ ๊ทธ๋์ @RequestBody๋์ ์ @ModelAttribute๋ฅผ ์ฌ์ฉํด์ ์
๋ ฅ ๋ฐ๊ธฐ! Controller @PostMapping(value = "/write") public BaseResponse uploadPosting(@RequestPart MultipartFile image, @ModelAttribute PostingDto postingDto) throws IOException { try { postingService.uploadPosting(image, createPostingDto); return new Ba..
Spring
redis๋ฅผ ์ฌ์ฉํ๊ณ ec2์ ๋ฐฐํฌ๋ฅผ ํ๋๋ฐ io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.์ด๋ฐ ์๋ฌ๊ฐ ๋ด๋ค ์ฐพ์๋ณด๋๊น redis.conf ์์ ํ ๋ ์ค์ ํ๋ ๋น๋ฐ๋ฒํธ๊ฐ ํ์ํ๋ค๋ ๋ง! requirepass์ ์ ์๋ ๋น๋ฒ์ spring ํ๋ก์ ํธ application.yml์ ์ถ๊ฐ์ํค๋ฉด ๋๋ค! (local๋ก ํ ๋๋ ๋น๋ฒ์ด ํ์์์ง๋ง ec2๋ฅผ ํตํด ์ธ๋ถ์์ ์ ์ํ ๊ฒฝ์ฐ์๋ ๋น๋ฐ๋ฒํธ๊ฐ ์์ด์ผ ์ ์์ด ๊ฐ๋ฅ) redis: port: 6379 host: password: ์ password์ ์ค์ ํ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ ์ ์ํ๋ฉด ๋!
Spring
Bean Validation์ด๋? ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ JAVA์ ์ ํจ์ฑ ๊ฒ์ฌ ํ์ค ๊ธฐ์ ์ด๋ค. Bean Validation์ ํน์ ํ ๊ตฌํ์ฒด๊ฐ ์๋๋ผ Bean Validation 2.0์ด๋ผ๋ ๊ธฐ์ ํ์ค์ด๋ค. ๊ฒ์ฆ ์ ๋
ธํ
์ด์
๊ณผ ์ฌ๋ฌ ์ธํฐํ์ด์ค์ ๋ชจ์์ด๋ค. โญ ์ผ๋จ bean validation์ ์ฌ์ฉํ๊ธฐ ์ ์ ์์กด๊ด๊ณ๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค! Maven org.springframework.boot spring-boot-starter-validation Gradle implementation 'org.springframework.boot:spring-boot-starter-validation' ๐ช ์ด๋
ธํ
์ด์
์ ๋ฆฌ @NotBlank : ๋น ๊ฐ + ๊ณต๋ฐฑ๋ง ์๋ ๊ฒฝ์ฐ๋ฅผ ํ์ฉํ์ง ์์ @NotNull : null์ ํ์ฉํ์ง ..
Spring
ํ์๋ฆฌํ๋ ํ
ํ๋ฆฟ ์์ง์ด๋ค. ์คํ๋ง์ ์ฌ์ฉํ๋ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค! ์ฌ๊ธฐ์์ ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ณณ์ ํตํด์ ํ๋ก์ ํธ๋ ์์ฑํ๋ ๊ฒฝ์ฐ์๋ Dependencies์ ํ์๋ฆฌํ๋ฅผ ์ ํํ๋ฉด๋๋ค. ํน์ ์ ํํ์ง ์์๋ค๋ฉด build.gradle์ ๋ค์ด๊ฐ์ dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' } dependencies์์ ์ฝ๋๋ฅผ ์ถ๊ฐ์์ผ ์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค!! ๊ทธ๋ผ ํ์๋ฆฌํ ๊ฐ๋
์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค๐ ํ์๋ฆฌํ (Thymeleaf) ํ์๋ฆฌํ๋ ์๋ฒ ์ฌ์ด๋ ์๋ฐ ํ
ํ๋ฆฟ ์์ง์ด๋ค. โพ ์๋ฒ ์ฌ์ด๋ HTML ๋ ๋๋ง ๋ฐฑ์๋ ์๋ฒ์์ HTML์ ๋์ ์ผ๋ก ๋ ๋๋ง ํ๋ ์ฉ๋์ด๋ค. โพ ๋ด์ถ๋ด ..
Spring
spring์ ๊ณต๋ถํ๋ค ๋ณด๋๊น Model์ด๋ @ModelAttribute๊ฐ ๋๋ฌด ๋ง์ด ๋์์ ํ๋ฒ ์ ๋ฆฌ ์ข ํ๊ณ ์ถ์ด์ ๊ธ ์ฐ๊ฒ ๋๋ค... Model์ด๋ @ModelAttribute๋ ๋ค๋ฅด์ง๋ง ์๊พธ ํท๊ฐ๋ ค์ใ
ใ
ใ
ใ
ใ
ใ
ใ
๐ Model ๐ Model์ ๊ฐ์ฒด์ด๋ค. view์ ์ด๋ฆ๊ณผ view๋ฅผ ๋ ๋๋งํ ๋ ํ์ํ๋ค. map์ผ๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ controller์์ view์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ key, value๋ก ๋ฃ์ด์ค๋ค. Servlet์์ request.setAttribute()์ ๋น์ทํ ์ญํ ์ ํ๋ค. model๊ฐ์ฒด์ ๋ด์ ๋๋ model.addAttribute("key", value)๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๐ @ModelAttribute ๐ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ ํ์ํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ๊ทธ ๊ฐ์ฒด์ ๊ฐ์ ๋ฃ์ด์ฃผ์ด..
Spring
๐ฌ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋ ์ฃผ๋ก 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ค. โพ GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ /?username=hello&age=20 ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉํ๋ค. ๋ฉ์์ง ๋ฐ๋ ์์ด, url์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํด์ ์ ๋ฌํ๋ค. ๊ฒ์, ํํฐ, ํ์ด์ง์์ ๋ง์ด ์ฌ์ฉ โพ POST - HTML Form content-type : application/x-www-form-urlencoded ํ์ ๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌ (username=hello&age=20) ํ์๊ฐ์
, ์ํ์ฃผ๋ฌธ์์ ๋ง์ด ์ฌ์ฉ โพ HTTP message body์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์์ ์์ฒญ HTTP API์์ ์ฃผ๋ก ์ฌ์ฉ (JSON, XML, TEXT) ๋ฐ์ดํฐ ํ์์ ์ฃผ๋ก JSON์ฌ์ฉ POST, PUT, ..
Spring
์คํ๋ง ์
๋ฌธ ๊ฐ์, ๊ธฐ์ด๊ฐ์๋ฅผ ๋ค์์ ๋ ์ข
์ข
๋ณด์๋ RequestMapping์ ๋ํ ๊ธฐ์ด๋ฅผ ๋ค์ ๋ค์ก๋ค! ์์ง ๊ธฐ์ด๋ง ๋ฐฐ์ด ๊ฑฐ๋ผ ์ค๋ฌด์์ ์ด๋์ ์ฌ์ฉํ ์ง ๊ฐ๋ฐ์ ์ค์ง ์์ง๋ง ์ธ์ ๊ฐ ๋ฅ์๋ฅ๋ํ๊ฒ ๋ค๋ฃจ๊ณ ์ถ๋ค๐ RequestMapping(์์ฒญ ๋งคํ) ์ด๋? ์์ฒญ์ด ์์ ๋ ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ์ด ๋์ด์ผ ํ๋์ง ์๋ ค์ฃผ๋ ์งํ ๊ฐ์ ๊ฒ์ด๋ค. ๐ ์์ @RequestMapping(value = "/hello-basic") ์ด๋ ๊ฒ ๋งคํ์ ํ๋ฉด localhost:8080/hello-basic์ผ๋ก url์ ์
๋ ฅํ์ ๊ฒฝ์ฐ์ ์ด๊ฒ์ ํด๋นํ๋ ๋ฉ์๋๊ฐ ์คํ๋๋ค. @RequestMapping์ ๋ค์ค์์ฒญ๋ ๊ฐ๋ฅํ๋ค! ๋ค์ค ์์ฒญ์ ํ๋ ค๋ฉด ๋ฐฐ์ด๋ก ๋ฌถ์ด์ผ ํ๋ค. @RequestMapping(value = {"/hello", "/..
Spring
์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ ์ผ๋ก ์ถ๊ฐ๋๋ค. ๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข
๋ฅ๊ฐ ๋ง์๋ฐ ๊ทธ๊ฒ์ ํตํฉ์ ์ผ๋ก ์ธํฐํ์ด์ค๋ก ์ ๊ณตํ๋ ๊ฒ์ด SLF4J ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ค๋ฌด์์๋ Logback์ ๋๋ถ๋ถ ์ฌ์ฉํ๋ค. ๐ฌ ๋ก๊ทธ ์ ์ธ ๋ฐฉ๋ฒ // 1๋ฒ ๋ฐฉ๋ฒ private Logger log = LoggerFactory.getLogger(getClass()); // 2๋ฒ ๋ฐฉ๋ฒ private static final Logger log = LoggerFactory.getLogger(Xxx.class); //3๋ฒ ๋ฐฉ๋ฒ ์ ๋
ธํ
์ด์
์ฌ์ฉ(lombok์ด ์ ๊ณต) @Slf4j โ ์ฒซ๋ฒ์งธ ๋ ๋ฒ์งธ ๋ก๊ทธ ์ ์ธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ก๊ทธ๋ slf4j๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ๐ ๋ก๊ทธ ์ฌ์ฉ ๋ฐฉ๋ฒ @Slf4j // lombok์ด ์ ๊ณตํ๋ ๊ธฐ..
Spring
spring mvc๊ฐ์๋ฅผ ๋ฃ๊ธฐ ์์ํ๋ค! mvc๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์๋ธ๋ฆฟ๋ถํฐ ๊ฐ๋จํ ์ดํด๋ณด๋๋ฐ ์ ์ดํดํ ๊ฑด์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค...! ์ด๋ฒ์๋ ์๋ธ๋ฆฟ์ ์ด์ฉํด์ ์ดํด๋ณธ ์์ฒญ๊ณผ ์๋ต ๋ฉ์์ง๋ฅผ ํ์ธํด๋ณด๊ณ ์๋ ์๋ฆฌ๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค. ๐ ์คํ๋ง ๋ถํธ์์ ์๋ธ๋ฆฟ์ ์ง์ ๋ฑ๋กํด์ ์ฐ๋ ค๋ฉด ์ด๋
ธํ
์ด์
์ ํ๋ ์ถ๊ฐํด์ผ ํ๋ค. @ServletComponentScan //์๋ธ๋ฆฟ ์๋ ๋ฑ๋ก [ ์๋ธ๋ฆฟ ๋ฑ๋กํ๊ธฐ ] @WebServlet(name="", urlPatterns = "/") name : ์๋ธ๋ฆฟ ์ด๋ฆ urlPatterns : URL ๋งคํ [ HttpServletRequest ] ๋จผ์ http ์์ฒญ ๋ฉ์์ง๋ฅผ ์ดํด๋ณด์๋ฉด. POST /save HTTP/1.1 Host: localhost:8080 Content-Type: app..