Software Architecture/MSA

[MSA κ΅¬μΆ•ν•˜κΈ°] 1. λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μƒμ„±ν•˜κΈ°

bu119 2024. 3. 6. 09:00
728x90
λ°˜μ‘ν˜•

πŸ”Š μš°λ¦¬λŠ” Spring Cloudλ₯Ό ν™œμš©ν•˜μ—¬ MSAλ₯Ό κ΅¬μΆ•ν•œλ‹€.

πŸ”Š μ΄λ²ˆμ—λŠ”, λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό 생성할 것이닀. 

 

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λŠ” user, beverage, community 3개의 μ„œλΉ„μŠ€λ‘œ κ΅¬μ„±ν•œλ‹€.

  1. user-service
  2. beverage-service
  3. community-service

⭐ μ›Ή ν”„λ‘œμ νŠΈλ₯Ό 생성할 λ•Œ ν•„μš”ν•œ μ˜μ‘΄μ„±μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

1. Lombok

lombok μ€ Java 라이브러리 쀑 ν•˜λ‚˜λ‘œ Java 개발 μ‹œμ— 반볡적으둜 κ΅¬ν˜„λ˜λŠ” getter, setter, toString λ“±μ„ μžλ™μœΌλ‘œ 생성해 μ£Όμ–΄ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•˜κ³  생산성을 λ†’μ—¬μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. μ–΄λ…Έν…Œμ΄μ…˜μ„ 기반으둜 λ™μž‘ν•˜λ©°, ν΄λž˜μŠ€μ— μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜μ—¬ 컴파일 κ³Όμ •μ—μ„œ μ‹€μ œ κΈ°λŠ₯이 μƒμ„±λ˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. μ¦‰, μ†ŒμŠ€μ½”λ“œμ—μ„œλŠ” μ–΄λ…Έν…Œμ΄μ…˜λ§Œ 보이고 ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ€ 보이지 μ•Šμ§€λ§Œ μ‹€μ œλ‘œ 컴파일된 κ²°κ³Όλ¬Ό. class νŒŒμΌμ—λŠ” μ½”λ“œκ°€ μƒμ„±λ˜κ²Œ λœλ‹€.

 

lombok을 μ‚¬μš©ν•˜λ©΄ 반볡적인 μ½”λ“œκ°€ μ œκ±°λ˜μ–΄ μ½”λ“œμ˜ 가독성이 쒋아지고 μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν•΄μ§„λ‹€. λ˜ν•œ 반볡적인 μ½”λ“œ μž‘μ„±μ˜ μ‹œκ°„μ΄ 쀄어 생산성이 ν–₯μƒλœλ‹€. ν•˜μ§€λ§Œ κ²½μš°μ— λ”°λΌμ„œλŠ” μ½”λ“œκ°€ 직관적이지 μ•Šκ³  μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μƒλž΅λ˜λŠ” 것에 λΆˆνŽΈν•¨μ΄ μžˆμ„ μˆ˜λ„ μžˆμ–΄ 상황에 맞게 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

λ˜ν•œ λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ κ΅¬ν˜„μ΄ λ˜λŠ”μ§€ 이해λ₯Ό ν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μ˜ˆλ₯Ό λ“€μ–΄ @ToString의 경우 클래슀의 λ‚΄λΆ€ ν•„λ“œμ˜ 성격에 λ”°λΌμ„œ μˆœν™˜ μ°Έμ‘°λ‚˜ λ¬΄ν•œ μž¬κ·€ 호좜 λ“±μ˜ 문제λ₯Ό λ°œμƒν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 각 κΈ°λŠ₯듀이 κ΅¬ν˜„ν•˜λŠ” λ‘œμ§μ— λŒ€ν•΄μ„œ μˆ™μ§€ν•˜κ³  λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έ 상황에 λŒ€ν•΄μ„œ νŒŒμ•…ν•œ 후에 μ‚¬μš©ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

 

2. Spring Web

Spring Web은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜λŠ” 데 ν•„μš”ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μŠ€ν”„λ§ λΆ€νŠΈμ˜ μ˜μ‘΄μ„±μ΄λ‹€.

Spring MVC, Tomcat, Jackson 같은 μ›Ή κ°œλ°œμ— ν•„μš”ν•œ λŒ€λΆ€λΆ„μ˜ 라이브러리λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€.

 

Spring Boot ν”„λ‘œμ νŠΈμ—μ„œ Spring Web μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μ£Όμš” λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ μžλ™μœΌλ‘œ μ„€μ •λœλ‹€.

  1. Spring Boot Starter Web: Spring Boot Starter WebλŠ” Spring Webκ³Ό κ΄€λ ¨λœ 기본적인 섀정을 μžλ™μœΌλ‘œ ν•΄μ£ΌλŠ” μŠ€νƒ€ν„°(Starter) νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€. 이λ₯Ό μΆ”κ°€ν•˜λ©΄ Spring MVC, λ‚΄μž₯ μ›Ή μ„œλ²„ μ„€μ •, 기본적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ성 등이 μžλ™μœΌλ‘œ μ„€μ •λ©λ‹ˆλ‹€.
  2. Spring MVC: Spring MVCλŠ” Model-View-Controller νŒ¨ν„΄μ„ 기반으둜 ν•œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜κΈ° μœ„ν•œ 핡심 λͺ¨λ“ˆμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” 컨트둀러(Controller), λͺ¨λΈ(Model), 그리고 λ·°(View)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜κ³ , 각각의 역할을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. λ‚΄μž₯ μ›Ή μ„œλ²„ μ„€μ •: Spring BootλŠ” ν†°μΊ£(Tomcat), μ œν‹°(Jetty), μ–Έλ”ν† μš°(Undertow) λ“±μ˜ λ‚΄μž₯ μ›Ή μ„œλ²„λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. Spring Web μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜λ©΄ 기본적으둜 μ΄λŸ¬ν•œ λ‚΄μž₯ μ›Ή μ„œλ²„μ˜ 섀정이 μžλ™μœΌλ‘œ μΆ”κ°€λ©λ‹ˆλ‹€. 이λ₯Ό 톡해 λ³„λ„λ‘œ μ›Ή μ„œλ²„λ₯Ό μ„€μΉ˜ν•˜κ±°λ‚˜ ꡬ성할 ν•„μš” 없이 κ°„νŽΈν•˜κ²Œ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  4. RESTful μ›Ή μ„œλΉ„μŠ€ 지원: Spring Web은 RESTful μ›Ή μ„œλΉ„μŠ€λ₯Ό μ‰½κ²Œ κ°œλ°œν•  수 μžˆλŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 JSON λ˜λŠ” XML ν˜•μ‹μ˜ 데이터λ₯Ό μ£Όκ³ λ°›λŠ” RESTful μ›Ή μ„œλΉ„μŠ€λ₯Ό ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.
  5. 데이터 바인딩과 μœ νš¨μ„± 검사: Spring Web은 HTTP μš”μ²­μ˜ 데이터λ₯Ό μžλ™μœΌλ‘œ Java 객체둜 λ°”μΈλ”©ν•˜κ³ , λ°μ΄ν„°μ˜ μœ νš¨μ„±μ„ 검사할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ‚¬μš©μž μž…λ ₯을 μ²˜λ¦¬ν•˜κ³  κ²€μ¦ν•˜λŠ” μž‘μ—…μ„ κ°„νŽΈν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ Spring Web을 μ‚¬μš©ν•˜λ©΄ Spring 기반의 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉ λ₯΄κ³  효율적으둜 κ°œλ°œν•  수 있으며, Spring Boot의 μžλ™ ꡬ성 κΈ°λŠ₯을 톡해 μ„€μ •μ˜ λ³΅μž‘μ„±μ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Spring Web의 μ£Όμš” μ–΄λ…Έν…Œμ΄μ…˜

μ–΄λ…Έν…Œμ΄μ…˜ μ„€λͺ…
@SpringBootApplication μŠ€ν”„λ§ λΆ€νŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ£Όμš” ꡬ성 μš”μ†Œλ‘œ, μžλ™ ꡬ성, ꡬ성 μš”μ†Œ 검색 및 ν”„λ‘œνΌν‹° 섀정을 μ œκ³΅ν•©λ‹ˆλ‹€.
@Configuration μŠ€ν”„λ§ 빈 섀정을 μœ„ν•œ ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이 μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ @Bean λ©”μ„œλ“œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.
@Bean μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μ˜ν•΄ κ΄€λ¦¬λ˜λŠ” 빈 객체λ₯Ό μ •μ˜ν•˜λŠ” λ©”μ„œλ“œμž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. @Configuration μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ 클래슀 λ‚΄μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.
@Component μŠ€ν”„λ§ 관리 빈으둜 λ“±λ‘λ˜λŠ” ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 일반적으둜 μ˜μ‘΄μ„± μ£Όμž…(Dependency Injection)을 μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.
@Controller μŠ€ν”„λ§ MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 컨트둀러둜 μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
@Service μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ„œλΉ„μŠ€ ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
@Repository μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 리포지토리 ν΄λž˜μŠ€μž„μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
@ComponentScan μ»΄ν¬λ„ŒνŠΈλ₯Ό κ²€μƒ‰ν•˜μ—¬ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ§€μ •λœ νŒ¨ν‚€μ§€μ—μ„œ @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ 클래슀λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.

 


λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ΅¬μΆ•ν•˜κΈ°

1. 개발 ν™˜κ²½

도ꡬ 버전
IntelliJ  2023.03.04
Java  17
Gradle  8.5
SpringBoot  3.2.3

 

2. Dependincies μΆ”κ°€

  1. Lombok
  2. Spring Web

λ‹€λ₯Έ μ˜μ‘΄μ„±(dependency)은 좔후에 ν•„μš”μ‹œ μΆ”κ°€ν•  μ˜ˆμ •μ΄λ‹€.

 

3. λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν”„λ‘œμ νŠΈ 생성

Spring Initializrλ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ ν”„λ‘œμ νŠΈλ“€μ„ 생성해 μ€€λ‹€.

https://start.spring.io/  μ˜ μ£Όμ†Œλ‘œ Spring Initializr에 μ ‘κ·Όκ°€λŠ₯ν•˜λ‹€.

 

user-service

 

beverage-service

 

community-service

 

λ°˜μ‘ν˜•

μƒμ„±λœ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ 폴더 ꡬ쑰


 

참고 자료

https://adjh54.tistory.com/311

https://velog.io/@kkh30123/Spring-boot-Starter-Web

https://jammdev.tistory.com/201

728x90
λ°˜μ‘ν˜•