πŸ”₯ 문제점

우리 ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©μžλŠ” ROLE_GUEST ν˜Ήμ€ ROLE_HOST에 ν•΄λ‹Ήν•˜λŠ” κΆŒν•œμ„ κ°€μ§ˆ 수 μžˆλ‹€. 그리고, κΆŒν•œμ— 따라 μ ‘κ·Όν•  수 μžˆλŠ” API λ˜ν•œ μƒμ΄ν•˜λ‹€. 예λ₯Ό λ“€μ–΄, λ¬Όν’ˆ 등둝에 ν•΄λ‹Ήν•˜λŠ” API Call은 ROLE_GUEST의 κΆŒν•œμ„ κ°€μ§„ μœ μ €λ§Œμ΄ κ°€λŠ₯ν•˜λ‹€. 즉, ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° API Call이 λ“€μ–΄μ˜€λ©΄ μ„œλ²„ 츑은 ν•΄λ‹Ή μœ μ €μ˜ κΆŒν•œμ„ ν™•μΈν•˜λŠ” μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

μ²˜μŒμ—λŠ” μ»¨νŠΈλ‘€λŸ¬λ‹¨μ—μ„œ getCurrentUserRole() λ©”μ„œλ“œλ₯Ό 톡해 ν˜„μž¬ λ‘œκ·ΈμΈν•œ μœ μ €μ˜ κΆŒν•œμ„ λΆˆλŸ¬μ™€, κΆŒν•œμ΄ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ Έμ£ΌλŠ” 방식을 κ³ λ €ν–ˆλ‹€. ν•˜μ§€λ§Œ, μ΄λ ‡κ²Œ ν–ˆμ„ λ•Œ 문제점이 λͺ‡κ°€μ§€ μ‘΄μž¬ν–ˆλŠ”λ°,

@PutMapping("/keep")
	public BaseResponse<Void> keep(@Valid @RequestBody MatchingKeepRequest matchingRequest, HttpServletRequest servletRequest) {
		Long userId = extractUserId(servletRequest);
		if (!RequestParser.getCurrentUserRole().equals("ROLE_HOST")) {
			throw new CustomRuntimeException(UserException.NOT_AUTHORIZED);
		}
		return matchingService.keep(matchingRequest, userId);
	}

  1. 가독성이 ꡬ렸닀.
  2. 컨트둀러의 λͺ¨λ“  λ©”μ„œλ“œμ— κΆŒν•œ κ΄€λ ¨ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό μΆ”κ°€μ μœΌλ‘œ ν•΄μ£Όμ–΄μ•Ό ν–ˆλ‹€.

πŸ“•ν•΄κ²°λ°©μ•ˆ

AOPλ₯Ό λ„μž…ν•˜μ—¬ κΆŒν•œ 검증 λ‘œμ§μ„ 곡톡 κ΄€μ‹¬μ‚¬λ‘œ λΆ„λ¦¬ν•˜μ—¬ κ΄€λ¦¬ν•˜κΈ°λ‘œ ν–ˆλ‹€.

AOP(Aspect-Oriented Programming)λž€?

**AOP(Aspect-Oriented Programming)**λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ— λŒ€ν•œ 뢀가적인 관심사λ₯Ό λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 λΆ„λ¦¬ν•˜λŠ” κ°œλ…μ΄λ‹€.

즉, MatchingController 및 MatchingService의 keep λ©”μ„œλ“œμ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ 보관 μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 것이고, λΆ€κ΄€μ‹¬μ‚¬λŠ” κΆŒν•œ 확인 등이 μžˆλ‹€. μ—¬κΈ°μ„œ κΆŒν•œ 검증 파트λ₯Ό λͺ¨λ“ˆν™”ν•˜κ³ μž ν•˜λŠ” 것이닀. 이 외에도 AOPλŠ” λ‘œκΉ…, νŠΈλžœμž­μ…˜ 관리 λ“±μ˜ λ°˜λ³΅μ μ΄κ±°λ‚˜ νš‘λ‹¨ 관심사(cross-cutting concern)λ₯Ό λͺ¨λ“ˆν™”ν•˜λŠ” 데에 μœ μš©ν•˜λ‹€.

❓ νš‘λ‹¨ 관심사(cross-cutting concern)?

νš‘λ‹¨ κ΄€μ‹¬μ‚¬λŠ”, μ—¬λŸ¬ λͺ¨λ“ˆμ΄λ‚˜ 계측에 걸쳐 반볡적으둜 λ‚˜νƒ€λ‚˜λŠ” κΈ°λŠ₯μ΄λ‚˜ λ‘œμ§μ„ μ˜λ―Έν•œλ‹€. μ—¬κΈ°μ„œλŠ” κΆŒν•œ 확인 둜직이 이에 μ†ν•œλ‹€.

AOP μš©μ–΄