๋ชฉ๋ก๐ฅ BE ๋ฐฑ์๋ (118)
Bibi's DevLog ๐ค๐
PUT method POST๋ก๋ ํ์์ ๋ณด ์์ ์ ๊ฐ๋ฅํ์ง๋ง, PUT ์ ์ฌ์ฉํด ์์ฒญ์ ๋ช ํํ ํ๋ ๊ฒ์ด RestAPI๊ด์ ์์ ๋ ๋ฐ๋์งํ๋ค. POST ๋์ PUT method๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์์ ํ๋ฉด(updateForm.html)์์ ์์ ๋ ๊ฐ์ ์ ์กํ ๋ PUT๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด hidden์ผ๋ก ์ ์กํ๋ค. ์ form ์ฌ๋ ํ๊ทธ ์๋์ ๋ฃ๋๋ค. โ ์ method๋ฅผ put์ผ๋ก ๋ฐ๊พธ์ด์๋ ์ ๋๋ค! form์ get/post๋ง ์ง์ํ๊ธฐ ๋๋ฌธ. updateForm.html // ... ์์ ๊ฐ์ด _method๋ก PUT์ ์ ๋ฌํ๋ฉด UserController์์๋ @PutMapping์ผ๋ก URL์ ๋งคํํ ์ ์๋ค. PUT ๋ฉ์๋ ์ค๋ฅ์ ํด๊ฒฐ๋ฐฉ์ spring.mvc.hiddenmethod.filter.enabl..
Optional Optional ์ต์ ๋ : ''๊ฐ์ฒด''๊ฐ null์ธ์ง ์๋์ง ํ๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. Optional byId = userRepository.findById(id); ↓ User user = userRepository.findById(id).orElseGet(User::new); ๋๋ค๋ฅผ ๋ฉ์๋์ฐธ์กฐ๋ก ๋ฐ๊พธ๊ธฐ () -> new User() == User::new ๋๋ค์์ ์ถ์ฝํ ๋ฉ์๋ ์ฐธ์กฐ์?์ด๋ค. orElseGet() : null์ผ ๋ ()์์ ์คํํ๋ค. ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค์์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค orElseThrow() : null์ผ ๋ ํด๋น ์์ธ๋ฅผ ๋์ง๋ค. (๊ฒฐ๊ตญ Optional ์ฌ์ฉํ ๋๋ ํญ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ, ๋๋ค์ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํ๋ฉด ๋..
๋์์ฑ Concurrency (+ ๋ณ๋ ฌ์ฑ) ์ถ์ฒ : ๋ธ๋ก๊ทธ1, ๋ธ๋ก๊ทธ2 Q. ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ์ ์์ฒญ์ด ๋์์ ๋ค์ด์ฌ ๋, ArrayList๋ ์ด๋ป๊ฒ ๋์ํ๊ฒ ๋ ๊น์? '๋์์~ ์ฌ๋ฌ~' ๊ฐ ๋ฑ์ฅํ๋ฉด ๋์์ฑ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ ๊ฒ ๊ฐ์์. ๋จ์ํ ArrayList๋ ๋์์ฑ ๋ฌธ์ ์์ ์์ ํ์ง ๋ชปํ ์๋ฃ๊ตฌ์กฐ์ ๋๋ค! (์ค๋ ๋ ๊ฐ๋ ๊ณผ ์ด์ด์ง) ๋น๋๊ธฐ Asynchronous ํ๋ก๊ทธ๋๋ฐ - ๋์์ฑ๊ณผ ๋ณ๋ ฌ์ฑ : ์ฝ๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฐฉ์. ํ๋ก๊ทธ๋จ์ ์ฃผ ์คํ ํ๋ฆ์ ๋ฉ์ถ์ด์ ๊ธฐ๋ค๋ฆฌ๋ ๋ถ๋ถ ์์ด, ๋ฐ๋ก ๋ค์ ์์ ์ ์คํํ ์ ์๊ฒ ํจ ๋์์ฑ Concurrency ํ๋ก๊ทธ๋๋ฐ : ๋ ผ๋ฆฌ์ ์ผ๋ก ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ. ๋ฉํฐํ์คํน์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ..
[JPA] CrudRepository์ ๋ฉ์๋ ์ถ์ฒ : Spring docs CrudRepository CRUD ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค. org.springframework.data.repository ์ธํฐํ์ด์ค Repository๋ฅผ ํ์ฅํจ. ์ฌ์ฉ @Repository public interface PersonRepository extends CrudRepository { // ... } CrudRepository์ ๋ฉ์๋ long count() ๊ฐ์ฉ entity์ ์๋ฅผ ๋ฐํํจ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฐ์ดํฐ ๊ฐ์ ํ์ธ Delete void delete(T entity) ์ฃผ์ด์ง entity๋ฅผ ์ญ์ ํจ entity๊ฐ null์ด๋ฉด IllegalArgumentException์ ๋์ง void deleteById(ID i..
์ค๋์ ํธ๋ ์ค ์์ ์ํ(stateful)์ ๋ฌด์ํ(stateless)์ ์ฐจ์ด? ๋ฌด์ํ : ์ฃผ๋ฌธํ์๊ฒ ์ด์? - ์ ์ก๋ฎ๋ฐฅ ํ๋ ์ฃผ์ธ์. ์ํ ์ ์ง : ์ฃผ๋ฌธํ์๊ฒ ์ด์? - ๋ ๋จน๋ ๊ฑธ๋ก ์ฃผ์ธ์. ์ฟ ํค Cookie ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ์๋ณํ๊ธฐ ์ํด, ์น ์๋ฒ๊ฐ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ค์นํ๋ ์์ ์ ๋ณด ํ์ผ. ''์ฟ ํค''๋ ํจ์ ค๊ณผ ๊ทธ๋ ํ ์์ ์ ๋ํ ํํ์ด๋ค. ์น ์๋ฒ๋ ๋ฌด์ํ(stateless)์ด๊ธฐ ๋๋ฌธ์, ํ์ฌ ์ ์ํ ์ฌ์ฉ์๊ฐ ์ด์ ์ ์ ์ํ ์ฌ์ฉ์์ธ์ง ์๋์ง ์ ์ ์๋ค. ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ด, ํ ๋ฒ ๋ก๊ทธ์ธํ ์ํ๊ฐ์ ์ ์งํ ์ ์๋ค. ๊ทธ๋์ ์๋ฒ๋.. ์๋ฒ : ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์์ ๋, Set - Cookie header๊ฐ์ผ๋ก ์ ์งํ๊ณ ์ถ์ ๊ฐ์ ํด๋ผ์ด์ธํธ์ ์ ์ก(respons..
์ฟ ํค, ์ธ์ , ์บ์๊ฐ ๋ญ๊ฐ์? ์ ๋ค '์น์์ ์ฌ์ฉ๋๊ณ , ๋ญ๊ฐ ์ํ๋ฅผ ์ ์ฅํ๋ค'๋ ๊ณตํต์ ์ด ์๋ค. ๊ฐ๋ฐ์๋ ์น์ ๋ง๋ค ๋, ์ด๋ค ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ ์ง ์ธ์ ์ ์ ์ฅํ ์ง ์ ํ๋จํด์ผ ํ๋ค. ์ฟ ํค Cookie : ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋ (๋ด ์ปดํจํฐ์ ์๋)''๋ธ๋ผ์ฐ์ ''์ ์ ์ฅ๋๋ ๋ด์ฉ. ์ฐ์ง๋ฐฉ์์์ ์๋ชฉ์ด์ . ๋ด๊ฐ ๋ค๊ณ ๋ค๋๋ฉด์ ์์ค์ ์ด์ฉํ ๋๋ง๋ค ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค. ๋ฏผ๊ฐ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ๋ฉด ํฐ์ผ ๋๋ค. (๊ฐ์ธ์ ๋ณด์ ์ถ) ํ์ฉ : ์์ด๋ ์ ์ฅ. '์ค๋๋ง ๋ณด์ง ์๊ธฐ'. ์ฆ ์ฟ ํค๋ ์ฌ์ฉ์์ ํธ์๋ฅผ ์ํด ์ฌ์ฉ๋์ง๋ง, ์ญ์ /๊ฐ๊ณต/๋๋๋์ด๋ ํฐ์ผ๋์ง ์๋ ์ ๋ณด๋ค์ '๋ธ๋ผ์ฐ์ '์ ์ ์ฅํ ๋ ์ฌ์ฉ๋๋ค. ๋จ์ : ๋ด๊ฐ ์์๋ก ์์ ๋ฐ ์ญ์ ํ ์ ์๋ค. ๋จ..
๋ฆฌ๋ทฐ์ด Dion๊ป์ ์๋ฐ ์๊ฐ ํ์ ๋ฐ ๊ฐ์ฒด์์ฑ, import์ ๋ํ ์ข์ ํผ๋๋ฐฑ์ ์ฃผ์ ์ ๊ธฐ๋ก์ผ๋ก ๋จ๊ธด๋ค! ๊ฐ์ฌํฉ๋๋ค๐โ๏ธ ๋ฉ์๋ ๋ค์ด๋ฐ ๋ฉ์๋์๋ ๋ฉ์๋ ๋ด๋ถ ๋์์ ๋๋ฌ๋ด๊ธฐ ๋ณด๋ค๋ ๋ฉ์๋๊ฐ ์ํํ ํ๋์ ์ ์ด์ฃผ์ธ์. ๊ฐ๋จํ๊ฒ home์ผ๋ก ๊ฐ๊ฒ์ด๋ home()์ ๋์ฌ๋ ์ถฉ๋ถํฉ๋๋ค. ์ ๊ทธ๋ ๊ตฐ์! ๋ฉ์๋๋ช ์ ๋์ฌ๋ก ํ๋ ๊ฒ ์ข๋ค๋ ๋ง์ ๋ค์ด์ ์ด๋ ๊ฒ ํ๋๋ฐ, ๋์ฌ์ ์ง์ฐฉํ๊ธฐ๋ณด๋ค๋ ๋ฉ์๋์ ํ๋์ ๋ํ๋ด๋ ๊ฒ์ ๋ ์ค์ ์ ๋๋ฉด ๋๋์?๐ฎ ๋ค ๋์ฌ ๋ณด๋ค๋ ๋ฉ์๋๊ฐ ์ด๋ค ์ผ์ ํด์ค ๊ฒ์ธ๊ฐ๊ฐ ๋ ์ค์ํ๋ต๋๋ค! +์ค์ฌ์ฐ๊ธฐ ์ง์ํ๊ธฐ (inputPw) ๋ณ์ ๋ค์ด๋ฐ ์์๋ณ์๋ผ๋ ๋ณ์๋ช ์ ๊ด์ฌ๋ ๋ถ์ด์ง ์๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค. aUser(โ) ์๋ฐ ๋ ์ง/์๊ฐ ํด๋์ค LocalDateTime ๋ฐ import์ ๋ํด publ..
@RequestMapping ์ฌ์ฉ๋ฒ ๊ณต๋ถํด์ ์ค๋ณตURL ์ ๊ฑฐํ์. ์ฐธ๊ณ : ๋ธ๋ก๊ทธ. ๊ฐ์ฌํฉ๋๋ค! @RequestMapping ์ด๋ ธํ ์ด์ ์ HTTP request๋ก ๋ค์ด์ค๋ URL์ ํน์ ์ปจํธ๋กค๋ฌ์ ํด๋์ค ๋๋ ๋ฉ์๋๋ก ์ฐ๊ฒฐ์ํค๋ ์ญํ ์ ํ๋ค. (์ปจํธ๋กค๋ฌ์ ํด๋์ค ๋ฐ ํน์ ๋ฉ์๋ ๋ชจ๋ ์ ์ฉ ๊ฐ๋ฅํ๋ค) ์ฌ์ค์ URL ๋ฟ ์๋๋ผ ํ๋ผ๋ฏธํฐ, ํค๋ ๋ฑ ์ฌ๋ฌ ๋ฒ์์ ์ ์ฉํ ์ ์๋ค๊ณ ํ๋ค. ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด ๋์ค์ ๊ณต๋ถํด์ผ๊ฒ ๋ค. @RequestMapping ๋ฅผ ํด๋์ค์ ์ ์ธํ๋ฉด ์ค๋ณตURL์ ์ ๊ฑฐํ ๋ ์ข๋ค. ์๋๋ ์์ . @Controller @RequestMapping("/home") public class TestController { @RequestMapping("/") String getName(){ retur..