๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Legacy

2022.03.11~03.13์˜ ๊ธฐ๋ก

by GroovyArea 2022. 3. 12.

โ–ถ 3์ผ ๊ณ„ํš

=>  ๊ณต๋ถ€ ๊ด€๋ จ

1) ์ˆ˜์—… ๋‚ด์šฉ ๋ณต์Šต

2) MVC ๊ฐ์ฒด์ง€ํ–ฅ ๋ฆฌํŒฉํ† ๋ง ์™„๋ฃŒ

3) ๊ธฐ์ˆ  ์งˆ๋ฌธ ๋‹ต๋ณ€ ๋…ธ์…˜ ์ •๋ฆฌ ๋ฐ SOLID ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OCP & DIP & ISP)

4) 8๊ฐœ์˜ ๋””์ž์ธ ํŒจํ„ด ์ •๋ฆฌ

 

=> ํŒŒ์ด๋„ ํ”„๋กœ์ ํŠธ ๊ด€๋ จ

1) ERD ๊ทธ๋ ค ๋†“๊ณ  pdf๋กœ ๋งŒ๋“ค์–ด๋†“๊ธฐ

2) ์ด๋ฏธ์ง€ ์ˆ˜์ง‘

 

๋งˆ์šฐ์Šค ๊ฑด์ „์ง€ ๋ฐ”๊ฟ”๋ผ!! [์™„๋ฃŒ]


โ–ถ ๋ฌธ์ œ ์ •๋ฆฌ

1. ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…์€ ๊ดœ์ฐฎ์Œ. ํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์œผ๋กœ ์˜์กดํ•˜์ง€ ๋ง๊ฒƒ (ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์–ด๋ ค์›€)

> ํ”Œ๋ ˆ์ด์–ด๋กœ ์ปดํ“จํ„ฐ๋ฅผ ์ฃผ์ง€๋ง๊ณ  ์™ธ๋ถ€์—์„œ ๋น„๊ต๊ฐ’์„ ์–ป์–ด๋ผ

public class Player {

	private final Rsp playerRsp;

	private final Computer computer = new Computer();

	// setter ๋Œ€์‹  ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…์‹œ์ผœ์„œ ํ•ด๊ฒฐ
	public Player(final Rsp playerRsp) {
		this.playerRsp = playerRsp;
	}

2. enum๋„ ๋ชจ๋ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋กœ์ง์„ ์ €์žฅํ•˜๋Š” ๊ณณ์ด ์•„๋‹˜

> ์™ธ๋ถ€์—์„œ ์ฃผ์ž… (์ปจํŠธ๋กค๋Ÿฌ์—์„œ?)

public enum PrintGameResult {
	
	WIN_RESULT("๋‹˜์ด ์ด๊ฒผ์Šต๋‹ˆ๋‹ค."), 
	DRAW_RESULT("๋น„๊ฒผ์Šต๋‹ˆ๋‹ค."), 
	LOSE_RESULT("์ปดํ“จํ„ฐ๊ฐ€ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค.");

	private final String printGameResult;

	private PrintGameResult(String printGameResult) {
		this.printGameResult = printGameResult;
	}

	public String getValue() {
		return printGameResult;
	}

	public static void resultOut(Result result) {
		
		if (result == Result.WIN)
			ViewOutput.singleGameResult(WIN_RESULT);
		if (result == Result.DRAW)
			ViewOutput.singleGameResult(DRAW_RESULT);
		if (result == Result.LOSE)
			ViewOutput.singleGameResult(LOSE_RESULT);
	}

}

 

=> ๋ทฐ ์˜์กด ใ„ดใ„ด , ๊ณ ์ณ๋ณด์ž!

 

 


โ–ถ ๊ฐœ์ธ ๊ณต๋ถ€

 

โ— MVC ํŒจํ„ด ์ ์šฉ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋žจ ๋ฆฌํŒฉํ† ๋ง

 

1. ์ปดํ“จํ„ฐ ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋ผ

package Model;


public class ComputerNumber {
	
	// ์ปดํ“จํ„ฐ ๊ฐ€์œ„๋ฐ”์œ„๋ณด์šฉ ์ž๋™ ์ˆซ์ž ์ƒ์ˆ˜
	private final int AUTO_NUMBER = (int)(Math.random() * 3) + 1;
	
	// ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฐ’ ์ •์ˆ˜ํ˜• ๋ฐ˜ํ™˜
	public int getComputerNumber() {
		return AUTO_NUMBER;
	}
}

=> ๋‹ค๋ฅธ ์†์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋ชจ๋ธ์—์„œ ๋ถ„๋ฆฌ์‹œํ‚ด ํ•„๋“œ๋Š” ํŒŒ์ด๋„ ์ƒ์ˆ˜๋กœ ์„ ์–ธ

 

2. Setter ๋ฉ”์„œ๋“œ๋ฅผ ์—†์• ๋ผ. ๋ถˆ๋ณ€์„ฑ์˜ ์›์น™

package Model;

import Enum.Rsp;
import Exception.RspException;

// ์ปดํ“จํ„ฐ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค
public class Computer {

	private int comRsp;
	private ComputerNumber computerNumber = new ComputerNumber();

	// setter ๋Œ€์‹  ์ƒ์„ฑ์ž๋กœ ๋Œ€์ž…์‹œ์ผœ์„œ ํ•ด๊ฒฐ
	// ์ปดํ“จํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅด ์ƒ์„ฑ ์‹œ ์ž๋™ ์ˆซ์ž(๊ฐ€์œ„๋ฐ”์œ„๋ณด) ์ €์žฅ
	public Computer() {
		this.comRsp = computerNumber.getComputerNumber();
	}

	public Rsp getComRsp() throws RspException {
		return Rsp.of(comRsp);
	}

}

=> ์™ธ๋ถ€์—์„œ ์ปดํ“จํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ์‹œ setter ๋Œ€์‹  ์ƒ์„ฑ์ž์—์„œ ์ž๋™ ์ƒ์ˆ˜๋ฅผ ํ•„๋“œ์— ์ฃผ์ž…์‹œํ‚จ๋‹ค. 

 

3. ๋ถˆ๋ณ€ ๊ฐ์ฒด

package Model;

import Enum.Result;
import Enum.Rsp;
import Exception.RspException;

// ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค
// ์ปดํ“จํ„ฐ์™€ ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ๋น„๊ตํ•  ๊ฒƒ
public class Player {

	private final Rsp playerRsp;

	private Computer computer = new Computer();

	// setter ๋Œ€์‹  ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…์‹œ์ผœ์„œ ํ•ด๊ฒฐ
	public Player(final Rsp playerRsp) {
		this.playerRsp = playerRsp;
	}
	
	// ์ฐธ๊ฐ€์ž ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๋ฐ˜ํ™˜
	public Rsp getRsp() {
		return playerRsp;
	}

	// ์ปดํ“จํ„ฐ ์ธ์Šคํ„ด์Šค ๋ฐ˜ํ™˜
	public Computer getComputer() {
		return computer;
	}
	
	// ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ
	public Result play() throws RspException {
		return Result.getGameResult(playerRsp, computer.getComRsp());
	}

}

=> ๋ถˆ๋ณ€์„ฑ์„ ๋„๋Š” ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” final๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ. ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ final ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ

 

ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ ๋งŒ๋“  ์ˆ˜์ •๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก

 

์€๋‹‰ํ™”์˜ ์žฅ์ 

  • ⇒ ๊ตฌ์ฒดํ™”๋œ ๋„ํ˜• ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค ๋„ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ตฌ์ฒดํ™”๋œ ํด๋ž˜์Šค(์‚ผ๊ฐํ˜•, ์›...)๋ฅผ ๋งŒ๋“ค์ž → ์ด๊ฒƒ์ด ๊ตฌ์ฒด์ ์ธ ํƒ€์ž… ์€๋‹‰
  • ⇒ private์„ ์ด์šฉํ•˜์—ฌ ์™ธ๋ถ€ ๋…ธ์ถœ์„ ์ค„์ž„
  • ⇒ ๋ฉ”์„œ๋“œ์˜ private ์€๋‹‰ํ™” → ํ•œ ๋ฉ”์„œ๋“œ๋กœ๋งŒ private ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ → ์™ธ๋ถ€์—์„œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์„ ์•Œ ์ˆ˜ ์—†๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค ๊ฐ์ฒด ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ ๊ฒŒ ์•Œ์•„๋„ ๋จ
  • ⇒ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ → ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋ชฐ๋ผ๋„ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์†์„ ๋ณดํ†ต ๋ฉ”์†Œ๋“œ์™€ ๋ณ€์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ ์ด๋Š” ํ‹€๋ฆฐ ๋ง์ด๋‹ค. ์ƒ์†์„ ํ†ตํ•ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ค‘์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํƒ€์ž…์ด๋‹ค. ์ด ํƒ€์ž…์„ ๋‚ด๋ ค ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ๊ฐ์ฒด๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค๋กœ ์ง€์นญ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ์ •๋ณด ์€๋‹‰์„ ๊ฐ€์ ธ์˜ค๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋ชจ๋“  ์ด์ ๋“ค์„ ๊ฐ€์ ธ ์˜จ๋‹ค.

https://effectiveprogramming.tistory.com/entry/๊ฐ์ฒด์ง€ํ–ฅ-์ •๋ณด-์€๋‹‰information-hiding์—-๋Œ€ํ•œ-์˜ฌ๋ฐ”๋ฅธ-์ดํ•ด

ํด๋ž˜์Šค ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ์ฐจ์ด์ 

  • ํด๋ž˜์Šค๋Š” ํ‹€์ด๋‚˜ ํŒฉํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋ถ„๋ฅ˜์— ๋Œ€ํ•œ ๊ฐœ๋…์ผ๋ฟ (์ถ”์ƒ์ ์ด๋ฉด ํด๋ž˜์Šค ๊ตฌ์ฒด์ ์ด๋ฉด ๊ฐ์ฒด์ด๋‹ค)
  • ๊ฐ์ฒด : ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์— ๊ตฌํ˜„ํ•  ๋Œ€์ƒ์ด๋ฉฐ ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ๋ชจ์–‘ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด → ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค
  • ์ธ์Šคํ„ด์Šค : ํด๋ž˜์Šค๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์— ๊ตฌํ˜„๋œ ๊ตฌ์ฒด์ ์ธ ์‹ค์ฒด
  • ⇒ ๊ฐ์ฒด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์— ์‹ค์ฒดํ™”ํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ธ์Šคํ„ด์Šค๋ผ ๋ถ€๋ฅด๊ณ  ์‹ค์ฒดํ™”๋œ ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค. ์ธ์Šคํ„ด์Šค < ๊ฐ์ฒด

์ดˆ๊ธฐํ™”๋ธ”๋Ÿญ ์ธ์Šคํ„ด์Šค ์˜์—ญ (T๋ฉ”๋ชจ๋ฆฌ)

  • ํด๋ž˜์Šค ๋ธ”๋Ÿญ์€ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์ธ์Šคํ„ด์Šค ๋ธ”๋Ÿญ์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
  • T๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

final ์„ ์–ธ ์‹œ ๊ธฐ๋ณธ, ์ฐธ์กฐ ํƒ€์ž… ์ฐจ์ด

  • ์›์‹œ ํƒ€์ž…์€ ๊ฐ’ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ
  • ๊ฐ์ฒด๋ผ๋ฉด ์ƒ์„ฑ์ž, static ๋ธ”๋Ÿญ์œผ๋กœ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ
  • ⇒ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋ผ๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋ผ๋ฉด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด(์ฃผ์†Œ)๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ (์†์„ฑ๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ → ๋‚ด๋ถ€์˜ ๊ฐ’์€ FINAL์˜ ์˜ํ–ฅ ๋ฐ–์ด๋‹ค)

์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ 

  • ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค
  • ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค - > ์ข…์†์„ฑ ์ œ๊ฑฐ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋†’์ž„
  • ํ‘œ์ค€ํ™”, ๊ทœ๊ฒฉํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

โ–ถ ์ˆ˜์—… ๋‚ด์šฉ

Spring AOP

JoinPoint

  • ํƒ€๊ฒŸ ๋ฉ”์„œ๋“œ(ํ•ต์‹ฌ ๊ด€์‹ฌ ๋ชจ๋“ˆ)์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
  • ⇒ Spring Container๊ฐ€ Advice ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด(JoinPoint ๊ฐ์ฒด)๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ
  • ⇒ Advice ๋ฉ”์„œ๋“œ (ํšก๋‹จ๊ด€์‹ฌ๋ชจ๋“ˆ)์—์„œ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ JoinPoint ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž‘์„ฑ
  • Around Advice ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ Advice ๋ฉ”์†Œ๋“œ๋Š” ๋ฐ˜ํ™˜ํ˜•์„ void๋กœ ์ž‘์„ฑํ•˜๋ฉฐ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ JoinPoint ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋ฃŒํ˜•์œผ๋กœ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅ
  • => ํšก๋‹จ๊ด€์‹ฌ๋ชจ๋“ˆ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋น„์ •์ƒ์ ์œผ๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ IllegalArgumentException ๋ฐœ์ƒ

JoinPoint.getTarget()

  • ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Spring Bean ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ⇒ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ Object ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜

Object.getClass()

  • ๊ฐ์ฒด์— ๋Œ€ํ•œ ํด๋ž˜์Šค ์ •๋ณด(Clazz)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

Class.getName()

  • Class ๊ฐ์ฒด(Clazz)์˜ ํด๋ž˜์Šค๋ช…(ํŒจํ‚ค์ง€ ํฌํ•จ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

Class.getSimpleName()

  • Class ๊ฐ์ฒด(Clazz)์˜ ํด๋ž˜์Šค๋ช…(ํŒจํ‚ค์ง€ ๋ฏธํฌํ•จ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

JoinPoint.getSignature()

  • ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด์ธ (Signature ๊ฐ์ฒด)๋ฅผ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

Signature.getName()

  • ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

JoinPoint.getArgs()

  • ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๋ชจ๋“  ๊ฐ’(๊ฐ์ฒด)์„ Object ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜

After Returning Advice ๋ฉ”์„œ๋“œ์—๋Š” JoinPoint ๋งค๊ฐœ๋ณ€์ˆ˜์™ธ์— Object ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž‘์„ฑ ๊ฐ€๋Šฅ

⇒ Obejct ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„ ์ €์žฅ

⇒ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’์˜ ์ž๋ฃŒํ˜•์ด ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ Object ํƒ€์ž… ๋Œ€์‹  ๋ฐ˜ํ™˜๊ฐ’์˜ ์ž๋ฃŒํ˜•์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ž‘์„ฑ

  • Bean Configuration FIle์˜ AOP ์„ค์ •์—์„œ After-retuning ์—˜๋ฆฌ๋จผํŠธ์˜ returning ์†์„ฑ์— ์†์„ฑ๊ฐ’์œผ๋กœ ๋ฐ˜๋“œ์‹œ ์„ค์ •ํ•ด์•ผ๋งŒ ํƒ€์ผ“๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ ์ €์žฅ ๊ฐ€๋Šฅ

Around Advice ๋ฉ”์„œ๋“œ๋Š” ๋ฐ˜ํ™˜ํ˜•์„ Void or Object ํƒ€์ž…์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ProceedingJoinPoint ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋ฃŒํ˜•์œผ๋กœ ์ž‘์„ฑ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ ์–ธ

⇒ Aroing Advice ๋ฉ”์„œ๋“œ๋Š” ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ œ๊ณต๋ฐ›์•„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด Object ํƒ€์ž…์œผ๋กœ ์„ ์–ธ

ProceedingJoinPoint

  • ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ(ํ•ต์‹ฌ๊ด€์‹ฌ๋ชจ๋“ˆ)์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด
  • ⇒ JoinPoint ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ์ ์€ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต
  • proceed() : ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์„œ๋“œ - ํ•ต์‹ฌ๊ด€์‹ฌ๋ชจ๋“ˆ ๋™์ž‘
  • ⇒ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ์ œ๊ณต๋ฐ›์•„ ์ €์žฅ ๊ฐ€๋Šฅ
  • ⇒ Throwable ๊ฐ์ฒด(ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒ๋˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ ๊ฐ์ฒด) ๋ฐœ์ƒ - ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

StopWatch

  • ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค
  • StopWatch.start() : ์‹œ๊ฐ„ ์ธก์ •์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ๊ฒŒ์‹œ๊ธ€ ๋‚จ๊ธธ ๋•Œ, ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ํ•œ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋ƒ ๊ธฐ๋กํ•  ๋•Œ ์“ฐ๋ฉด ๋ ๋“ฏ

Spring Configuration File (XML)

returning ์†์„ฑ

  • ํƒ€๊ฒŸ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํšก๋‹จ๊ด€์‹ฌ๋ชจ๋“ˆ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •

throwing ์†์„ฑ

  • ํƒ€๊ฒŸ๋ฉ”์†Œ๋“œ์—์„œ ๋ฐœ์ƒ๋œ ์˜ˆ์™ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํšก๋‹จ๊ด€์‹ฌ๋ชจ๋“ˆ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •

aop:aspectj-autoproxy

  • Aop ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ ํ•ต์‹ฌ๊ด€์‹ฌ๋ชจ๋“ˆ์— ํšก๋‹จ๊ด€์‹ฌ๋ชจ๋“ˆ์„ ์ž๋™์œผ๋กœ ์‚ฝ์ž…๋˜์–ด ๋™์ž‘๋˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ

 

pom.xml

https://mvnrepository.com/artifact/org.springframework/spring-context-support => Spring Context ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

https://mvnrepository.com/artifact/com.sun.mail/javax.mail => Java Mail ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

MailSender

  • ๋ฉ”์ด๋ธ์—์„œ api ๋‹ค์šด๋กœ๋“œ
  • ํ•ต์‹ฌ๊ด€์‹ฌ๋ชจ๋“ˆ

JavaMailSender.createMimeMessage()

  • MimeMessage ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • MimeMessage : ๋ฉ”์ผ ์ „์†ก ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด

MimeMessage.setSubject(String subject)

  • MimeMessage ๊ฐ์ฒด์˜ ๋ฉ”์ผ ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ

MimeMessage.setText(String content)

  • MimeMessage ๊ฐ์ฒด์˜ ๋ฉ”์ผ ๋‚ด์šฉ(ํ…์ŠคํŠธ)์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ

MimeMessage.setRecipients(RescipientType type, InternetAddress email)

  • MimeMessage ๊ฐ์ฒด์˜ ๋ฉ”์ผ์„ ์ˆ˜์‹ ํ•˜๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • RecipientType : ๋ฉ”์ผ ์ˆ˜์‹  ์‚ฌ์šฉ์ž ๋Œ€์ƒ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ƒ์ˆ˜
  • InternetAddress : ์ˆ˜์‹  ์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ ๊ฐ์ฒด - InternetAddress ๋Œ€์‹  String ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • InternetAddress.parse(String email) : ๋ฌธ์ž์—ด์„ ์ „๋‹ฌ๋ฐ›์•„ InternetAddress ๊ฐ์ฒด ๋ฐ˜ํ™˜

JavaMailSender.send(MimeMessage message) : SMTP ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์ผ์„ ์ „์†กํ•˜๋Š” ๋ฉ”์„œ๋“œ

Annotation

@Aspect

  • Spring Bean์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์— Aspect ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ Aspect ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

@Pointcut

  • ํ•ต์‹ฌ๊ด€์‹ฌ๋ชจ๋“ˆ์„ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ pointcut ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • ⇒ ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ Pointcut์— ๋Œ€ํ•œ ์žฌ์‚ฌ์šฉ์„ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ
  • ⇒ ๋ฉ”์„œ๋“œ๋ช…๊ณผ ๋ฉ”๊ฐœ๋ณ€์ˆ˜๊ฐ€ Pointcut ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค
  • value ์†์„ฑ : ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด(execution & within)๋ฅผ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •
  • ⇒ ๋‹ค๋ฅธ ์†์„ฑ์ด ์—†๋Š” ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’๋งŒ ์„ค์ • ๊ฐ€๋Šฅ

@Before

@AfterReturning

  • After Returning Advice ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ after-returning ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • returning ์†์„ฑ : ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •

@AfterThrowing

  • After Throwing Advice ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ after-throwing ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • throwing ์†์„ฑ : ํƒ€๊ฒŸ๋ฉ”์„œ๋“œ์—์„œ ๋ฐœ์ƒ๋œ ์˜ˆ์™ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์†์„ฑ๊ฐ’์œผ๋กœ ์„ค์ •

@After

  • After Advice ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ after ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

@Around

  • Around Advice ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
  • ⇒ Bean Configuration File์˜ around ์—˜๋ฆฌ๋จผํŠธ์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
๋ฐ˜์‘ํ˜•

'Legacy' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

2022.03.15์˜ ๊ธฐ๋ก  (0) 2022.03.15
2022.03.14์˜ ๊ธฐ๋ก  (0) 2022.03.14
2022.03.08~03.10 ์˜ ๊ธฐ๋ก  (0) 2022.03.09
2022.03.07 ์˜ ๊ธฐ๋ก  (0) 2022.03.07
2022.03.05~03.06 ์˜ ๊ธฐ๋ก  (0) 2022.03.05