‡๐Ÿ‘ฉ‍๐Ÿ’ป ‡ 65

[MSA] Resilience4j | ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๊ฐœ๋… ๋ฐ ์ ์šฉ

๐Ÿ“MSA ๊ตฌ์กฐ์—์„œ ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค์˜ ์—ญํ•  ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค(Circuit Breaker)๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์• ์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ, ํŠนํžˆ MSA(Microservices Architecture) ๊ตฌ์กฐ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ๋„คํŠธ์›Œํฌ๋‚˜ ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์• ๋‚˜ ์ง€์—ฐ์œผ๋กœ ์ธํ•œ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์žฅ์•  ํšŒํ”ผ (Fault Tolerance): ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋Š” ํŠน์ • ์„œ๋น„์Šค๋‚˜ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํ˜ธ์ถœ์„ ํšŒํ”ผํ•˜๊ณ  ์ฆ‰์‹œ ์‘๋‹ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์žฅ์• ๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์— ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค. Timeout ์„ค์ •: ์„œํ‚ท..

[MSA] Spring Cloud Netflix Eureka ์„œ๋ฒ„ ๊ตฌ์ถ•

๐Ÿ“Spring Cloud Netflix Eureka๋ž€? Netflix์—์„œ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ์œ„์น˜์™€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ฐพ๊ณ  ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๐Ÿ“Service Discovery๋ž€? ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ์œ„์น˜ ๋ฐ ์ƒํƒœ ์ •๋ณด(IP์ฃผ์†Œ์™€ Port๋ฒˆํ˜ธ)๋ฅผ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ธฐ์ˆ  ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์ ธ์„œ ํ†ต์‹ ํ•ด์•ผํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ํŠนํžˆ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๐Ÿ“Spring Cloud Netflix Eureka ์„œ๋ฒ„ ๊ตฌ์ถ• Eureka ์„œ๋ฒ„ ๊ตฌ์ถ•์€ ..

[MSA] Apache Kafka (๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ) ์„œ๋ฒ„ ๊ตฌ์ถ•

Apache Kafka ๋ž€? Apache Kafka(์ดํ•˜ Kafka)๋Š” ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์œผ๋กœ, ๋Œ€์šฉ๋Ÿ‰์˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. Kafka๋Š” ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ „์†กํ•˜๊ณ , ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค. MSA๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ์ชผ๊ฐœ์ ธ ์žˆ๋‹ค. Kafka๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์— ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค๊ฐ€ ๊ตฌ๋…ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋А์Šจํ•œ ๊ฒฐํ•ฉ(loose coupling)์„ ์ด‰์ง„ํ•˜๊ณ , ๊ฐ ์„œ๋น„์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. Kafka์˜ ๊ตฌ์„ฑ ์š”์†Œ ZooKeeper : Kafka..

[Spring] ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ | nginx proxy ์„œ๋ฒ„์™€ spring ์—ฐ๋™

์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ์™„์„ฑ๋œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ฅผ Maven > Lifecycle > package ๋ฅผ ๋‘ ๋ฒˆ ํด๋ฆญํ•ด์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด target ์•„๋ž˜์— jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ํŒŒ์ผ์„ ๋ฐฐํฌํ•˜๋ฉด ๋œ๋‹ค. ์ค€๋น„: ๋ฆฌ๋ˆ…์Šค 4๋Œ€ 1. Spring Boot server: 10.10.10.21 2. Nginx(Proxy server): 10.10.10.20 3. Master DB: 10.10.10.10 4. Slave DB: 10.10.10.11 -- 3, 4๋ฒˆ DB 2๋Œ€์— Master-Slave ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค. https://xoxoxoxox.tistory.com/107 [MySQL] Master-Server Replication ์„œ๋ฒ„ ๊ตฌ์ถ• ์‹ค์Šต VMwar..

[Error] @RequiredArgsConstructor | JPA Service๋‚˜ Repository์— Null Pointer ์—๋Ÿฌ

๋‹ค๋ฅธ ๋ณ€์ˆ˜์— Null Pointer Exception์ด ๋–ด์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๋””๋ฒ„๊น…์„ ๋Œ๋ ค๋ณด๋‹ˆ Null Pointer Exception์ด JPA Respoistory๋‚˜ Service์— ๋–ด๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ด ๊ณณ์— Null์ด ๋“ค์–ด๊ฐ€๋Š” ์ง€ ์˜๋ฌธ์ด ๋“ค์—ˆ๋Š” ๋ฐ, ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์˜์กด์„ฑ ์ฃผ์ž…์ด ์•ˆ๋ผ์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด์—ˆ๋‹ค. java.lang.NullPointerException: null at com.example.demo.user.service.UserService.create(UserService.java:93) ~[classes/:na]  @RequiredArgsConstructor์„ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด UserRepository๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‹œ์ผœ์คฌ๋Š” ๋ฐ,  final์„ ๋‹ฌ์•„์ฃผ์ง€ ์•Š์•„์„œ ์ƒ๊ธด ์—๋Ÿฌ์˜€๋‹ค. @..

[Error] ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ์‹ค์ˆ˜ ์—๋Ÿฌ - mappedBy reference an unknown target entity property: ... in ...

Error mappedBy reference an unknown target entity property: cohttp://m.example.demo.order.model.OrderedProduct.order in cohttp://m.example.demo.order.model.Orders.orderProductsList ํ•ด๊ฒฐ  @OneToMany์˜ mappedBy ํ•ญ์ƒ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์œ„ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋งž์ถฐ์ฃผ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜€๋‹ค. ++ Order์€ SQL ์˜ˆ์•ฝ์–ด๊ธฐ ๋•Œ๋ฌธ์— Order๋ผ๋Š” ํ…Œ์ด๋ธ”์€ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค!

์—ฐ๊ด€๊ด€๊ณ„ ์™ธ๋ž˜ํ‚ค ์ €์žฅํ•  ๋•Œ Entity๋กœ ํ•ด์ฃผ๋Š” ์ด์œ 

์˜๋ฌธ์  @ManyToOne์˜ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„์—์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ €์žฅํ•ด ์ค„ ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ Entity ๊ทธ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ดํ•ด๋˜์ง€ ์•Š์•˜๋‹ค. @Entity @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class OrderedProduct { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Integer id; @ManyToOne @JoinColumn(name="Product_id") Product product; @ManyToOne @JoinColumn(name="Orders_id") Orders order; } public void createOrder(Str..

[Spring] ๊ฒฐ์ œ ์„œ๋น„์Šค | ํฌํŠธ์› ์—ฐ๊ฒฐํ•˜๊ธฐ

๊ฒฐ์ œ ์„œ๋น„์Šค ํ”Œ๋žซํผ PortOne PortOne์€ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—… ๋˜๋Š” ํ”Œ๋žซํผ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•˜๊ณ , ์˜จ๋ผ์ธ ์ƒ๊ฑฐ๋ž˜๋‚˜ ๋‹ค๋ฅธ ๋””์ง€ํ„ธ ๊ฒฐ์ œ ํŠธ๋žœ์žญ์…˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” API, ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. PortOne์€ ๋ณด์•ˆ, ์‹ ๋ขฐ์„ฑ, ๋‹ค์–‘ํ•œ ๊ฒฐ์ œ ๋ฐฉ๋ฒ• ์ง€์› ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์œผ๋ฉฐ, ์ƒ์ธ๋“ค์ด ์•ˆ์ „ํ•˜๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์„œ๋น„์Šค์˜ ์„ธ๋ถ€์ ์ธ ๊ธฐ๋Šฅ์ด๋‚˜ ์ œ๊ณต๋˜๋Š” API์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ ์•„๋ž˜ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฉด ๋œ๋‹ค. https://portone.io/korea/ko ํฌํŠธ์›, ์˜จ๋ผ์ธ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ์œ„ํ•œ ํ†ตํ•ฉ ๊ฒฐ์ œ ์†”๋ฃจ์…˜ ์ฝ”๋“œ ํ•œ ์ค„๋กœ ์„ธ์ƒ ๋ชจ๋“  ๋ฐฉ์‹์˜ ๊ฒฐ์ œ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์„ธ์š” portone.io ๊ฒฐ..

[Spring] application.yml ์„ค์ •ํŒŒ์ผ

Git์—๋Š” ์„ค์ • ํŒŒ์ผ์ธ ymlํŒŒ์ผ์„ ์˜ฌ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š” ๋ฐ, ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋งŒ ๋นผ๊ณ  ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๊ฐ€๋ ค์ง„ ์ฑ„๋กœ ์—…๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Appllication์œผ๋กœ ์šด์˜ ์ƒํ™ฉ์— ๋งž๋Š” yml์„ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•˜๊ณ  ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์— deafult์ธ application.yml์„ ํฌํ•จํ•˜์—ฌ local ํ™˜๊ฒฝ, dev ํ™˜๊ฒฝ, prod ํ™˜๊ฒฝ์— ๋งž๋Š” yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ์šด์˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋งž๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Run/Debug ์˜ Edit Configuration์— ๋“ค์–ด๊ฐ€์„œ ์•Œ๋งž๊ฒŒ Application์„ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. --spring.profiles.active=local ์€ application-local.yml์˜ ์„ค์ •..

[Spring] Logging ๋กœ๊น…

๐Ÿ“Logger ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™” private final Logger log = LoggerFactory.getLogger(GlobalExceptionAdvise.class); final๋กœ ์„ ์–ธํ•ด์„œ ์–ด๋””์„œ๋‚˜ log ์ถœ๋ ฅ ๊ฐ€๋Šฅ! ๐Ÿ“Log level trace, debug, info, warn, error procteced ResponseEntity handleBindException(...){ log.error(String.format(); } ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ• ๋•Œ๋Š” log.error ๋กœ ํ•˜๊ณ  ์—๋Ÿฌ๊ฐ€ ์•„๋‹ ๋•Œ๋Š” Log level์„ info ๊ฐ™์€ ๊ฑธ๋กœ ํ•œ๋‹ค! Log level์ด debug์œผ๋กœ ํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค. application.yml logging: level: root: debug ์œ„ ์ฝ”๋“œ๋ฅผ ์ถ”..