0. Application Events์คํ๋ง์์ ์ง์ํ๋ ์ด๋ฒคํธ๋ก, ๋ด๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. Spring Event๋ฅผ ํตํด ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ(Event-Driven Architecture)๋ฅผ ๊ตฌํํ ์ ์๋ค. 1. ์ฌ์ฉ ์ด์ ํ ์์๋ฅผ ์์๋ณด์.@Servicepublic class UserService { private final UserRepository userRepository; private final EmailService emailService; @Transactional public void registerUser(User user) { userRepository.save(user); //์ฌ์ฉ์ ์ ์ฅ emailService..
์ ์ฒด ๊ธ
๊ฐ๋ฐ ์ง์์ ์๊ณ ๊บผ๋ด ์ฐ๋ ๋ธ๋ก๊ทธ์ ๋๋ค.![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxFbB4%2FbtsISNYB8pp%2FKP1tJJQreZk02keW9p7qwk%2Fimg.png)
๋ฐฐ๊ฒฝ ํ์์๋ JPA ๊ด๋ จ ๋ฉ์๋๋ค์ ์ธ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ์๋ค.User user = userRepository.findById(id).orElseThrow(...); orElseThrow() ๋ Optional ํด๋์ค์ ๋ฉ์๋๋ก, ๋จ์ํ๊ฒ ๊ฐ์ด null์ด๋ผ๋ฉด Exception์ ๋์ ธ์ฃผ๊ณ , null์ด ์๋๋ผ๋ฉด ๋ฐํํ๋ ํจ์์ด๋ค. ์ด๋ ๋จ์ํ ๊ฒฐ๊ณผ๊ฐ null์์ ์ฒ๋ฆฌํ ์ ๋ฐ์ ์์๋ค. ์ง๊ธ๊น์ง JPA๋ฉ์๋์์ Exception์ด ๋์ ธ์ง๋ ์ผ์ ์์์ง๋ง,JPA ๋๋ Hibernate์์ ๋์ ธ์ง๋ Exception ๋ํ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๊ฒ ๋ค๊ณ ์์ฌํด ๋ณด์๋ค. Repository Exception ์์ฃผ ์ฌ์ฉํ๋ findById์์๋ ๋ง์ฝ id๊ฐ null์ผ ๊ฒฝ์ฐ IllegalArgumentExcept..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhs2Tw%2FbtsH1CDjdYM%2FtpWyWSVEzZ1LMb48gw3Db1%2Fimg.png)
JPA์ save(), saveAll(), saveAllAndFlush() ๋ฉ์๋๋ค์ ์์์ฑ ์ปจํ
์คํธ ๊ฐ๋
๊ณผ ํจ๊ป ํจ์จ๊ณผ ์ฑ๋ฅ์ ๋ํ ์ฐจ์ด๋ฅผ ์์๋ณด๊ฒ ๋ค.1. save() ๋จ๊ฑด ์ํฐํฐ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ๋๋ค. @Transactional@Overridepublic S save(S entity) { Assert.notNull(entity, "Entity must not be null"); if (entityInformation.isNew(entity)) { entityManager.persist(entity); return entity; } else { return entityManager.merge(entity); }} ๋จผ์ isNew() ๋ฉ์๋๋ฅผ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoboEa%2FbtsHGaUZNjc%2FNPAeeorlSQGT1PhmkcsUV1%2Fimg.png)
๋ CORS ๋์ผ?1. ๋ฌธ์ ๋๋ Spring Cloud ๊ธฐ๋ฐ API ์๋ฒ๋ฅผ ๋ง๋ค๊ณ , Swagger๋ฅผ ์ด์ฉํ์ฌ API ๋ช
์ธ์๋ฅผ ๋ฐฐํฌํ๋ค. ๊ทธ๋ฐ๋ฐ.. ์ค์จ๊ฑฐ์์ ์์ธ์ง 403 Forbidden์ ๋ฐ์๋ค. Gateway์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด์๋๋,PRE Filter๊น์ง ํต๊ณผํ์ง๋ง, POST Filter๋ก ์จ Response๊ฐ 403 FORBIDDEN ์ด์๋ค. ์ฌ๊ธฐ์ ๋ ๋ฌธ์ ๋ postman์ ์ ์ ์๋ํ๋ ๊ฒ์ด์๋ค... 2. ํด๊ฒฐ ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด CORS ์ค๋ฅ์๋ค. postman์ผ๋ก๋ ๋๋ ์์ฒญ์ด๋ฉด CORS๋ฌธ์ ๋ผ๊ณ ์ง์์ ํ์ง๋ง, ์๋๋ผ๋ฉด ๊ฐ๋ฐ์ ๋ชจ๋์ ์ด๋ ๊ฒ ๋์์ผํ๊ธฐ ๋๋ฌธ์ CORS ์ค๋ฅ๋ ์๋ ์ค ์์๋ค. https://velog.io/@mingeloper/%ED%94%84%EB%A1%9C%E..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsh5ky%2FbtsHyWvQXG0%2FpvJ9NBwncKDJt5aVrZ9BCk%2Fimg.png)
์ฐธ๊ณ Amazon Linux 2023 Red Hat Linux ๊ธฐ์ค.0. ์์Spring Cloud ๊ธฐ๋ฐ ํ๋ก์ ํธ์ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์๋ค. ๊ธฐ์กด CI/CD์ ๋ค๋ฅธ ์ ์ ์ฌ๋ฌ ์๋น์ค๋ฅผ ํ๊บผ๋ฒ์ ๋ฐฐํฌํด์ผ๋๋ค๋ ๊ฒ์ด์๋ค. ๋ณธ ํ๋ก์ ํธ์ ์๋น์ค๋ ์๋ ์ธ๊ฐ์ง์๋ค.- noti-service- weather-service- user-service ๋๋จธ์ง ํ๊ฒฝ์ ์ํ ์๋น์ค๋ค์ ๋ค์๊ณผ ๊ฐ์๋ค.- Eureka- api-Gateway- config-service- Kakfa & Zookeper ํด๋น ์๋ฒ๋ค ๋ชจ๋ ์ง์์ ์ธ ๋ฐฐํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ค. ์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ์ ํ๋ค. - Eureka, config-service, kafka, zookeper ๋ค ๊ฐ์ง๋ ์๋น์ค ๋ก์ง์ด ์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฏ๋ก ์ปจํ
์ด๋ ์ต์ ํ๋ฅผ ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxYWEw%2FbtssT6YW04R%2FLITGgradCEFgZWvetSzo5k%2Fimg.png)
์นด์นด์ค ๊ณต์ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑhttps://developers.kakao.com/docs/latest/ko/kakaologin/common๊ตฌํ ์ฝ๋https://github.com/DDonghyeo/kakao-login์ฐธ๊ณ ์ด ๊ธ์ ์ ์ฐจ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ฑํด ๋๊ฐ๋ ๊ณผ์ ์
๋๋ค. ์ ์ฒด ์ฝ๋๋ ๊นํ๋ธ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.ํ๋ก ํธ(ํด๋ผ์ด์ธํธ) ๋ถ๋ถ์ thymeleaf๋ก ๊ตฌํํ์์ต๋๋ค.Spring Boot 3.x.x ๋ฒ์ ๊ธฐ์ค์
๋๋ค. ๋จผ์ , ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฐฉ์์ ๋ํด ์ดํดํ๊ณ ์์ํด์ผ ํ๋ค.์๋์ฒ๋ผ ์ ๋ฆฌํ๊ณ ์งํํ๊ฒ ๋ค.์นด์นด์ค ๋ก๊ทธ์ธ ์์ฒญ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์์ฒญํ๋ค. ๋ฏธ๋ฆฌ ์ค์ ํด๋ client_id (REST API KEY) + redirect URI ๊ฐ ์ค์ ๋ ๋งํฌ๋ก ๋ค์ด๊ฐ๋ค.์ฌ์ฉ์๊ฐ ์นด์นด์ค ๋ก๊ทธ์ธ์นด์นด์ค ๋ก๊ทธ์ธ ์ฐฝ..