Back-end/Spring

[Spring] ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด

๐Ÿ’ก ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด์ด๋ž€?

 

์ „๋žต ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹

 

์ด๋Ÿฐ ๋ฐฉ์‹์„ ์Šคํ”„๋ง์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

์ „๋žต ํŒจํ„ด์˜ ์ปจํ…์ŠคํŠธ๋ฅผ ํ…œํ”Œ๋ฆฟ์ด๋ผ ๋ถ€๋ฅด๊ณ , ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฝœ๋ฐฑ์ด๋ผ ํ•œ๋‹ค.

์ „๋žต ํŒจํ„ด๊ณผ DI์˜ ์žฅ์ ์„ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•ด ๋…ํŠนํ•˜๊ฒŒ ํ™œ์šฉ

 

์ฃผ๋กœ try/catch/finally ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์— ์‚ฌ์šฉ๋œ๋‹ค.

 

 

๐Ÿ’ก ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ์˜ ๋™์ž‘์›๋ฆฌ

 

์ฝœ๋ฐฑ์€ ๋ณดํ†ต ๋‹จ์ผ ๋ฉ”์†Œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋˜ํ•œ ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝœ๋ฐฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์†Œ๋“œ์—๋Š” ๋ณดํ†ต ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค.

 

 

๐Ÿ’ก ์ž‘์—… ํ๋ฆ„

 

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์€ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ฝœ๋ฐฑ์ด ์ฐธ์กฐํ•  ์ •๋ณด๋ฅผ ์ œ๊ณต
  2. ๋งŒ๋“ค์–ด์ง„ ์ฝœ๋ฐฑ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ…œํ”Œ๋ฆฟ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ
  3. ํ…œํ”Œ๋ฆฟ์€ ์ •ํ•ด์ง„ ํ๋ฆ„์„ ๋”ฐ๋ผ ์ž‘์—…, ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•œ ์ฐธ์กฐ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  4. ์ฝœ๋ฐฑ์€ ํด๋ผ์ด์–ธํŠธ ๋ฉ”์†Œ๋“œ์— ์žˆ๋Š” ์ •๋ณด์™€ ํ…œํ”Œ๋ฆฟ์ด ์ œ๊ณตํ•œ ์ฐธ์กฐ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ž‘์—… ์ˆ˜ํ–‰
  5. ์ž‘์—… ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹ค์‹œ ํ…œํ”Œ๋ฆฟ์— ๋ฐ˜ํ™˜
  6. ํ…œํ”Œ๋ฆฟ์€ ์ฝœ๋ฐฑ์ด ๋Œ๋ ค์ค€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์—…์„ ๋งˆ์ € ์ˆ˜ํ–‰
  7. ์ตœ์ข… ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ์— ๋‹ค์‹œ ๋ฐ˜ํ™˜

โœ๏ธ ๊ณ„์‚ฐ๊ธฐ ์˜ˆ์ œ

 

๐Ÿ“„ JUnit ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

public class CalcSumTest {
	Calculator calculator;
	String numFilepath;
	
	@Before public void setUp() {
		this.calculator = new Calculator();
		this.numFilepath = getClass().getResource("/numbers.txt").getPath();
		
	}
	
	@Test
	public void sumOfNumbers() throws IOException {
		assertThat(calculator.calcSum(this.numFilepath), is(10));
	}
	
	@Test
	public void multiplyOfNumbers() throws IOException {
		assertThat(calculator.calcMultiply(this.numFilepath), is(24));
	}
}

 

๐Ÿ“„ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค

import java.io.BufferedReader;
import java.io.IOException;

public interface BufferedReaderCallback {
	Integer doSomethingWithReader(BufferedReader br) throws IOException;
}

 

๐Ÿ“„ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ

public Integer fileReadTemplate(String filepath, BufferedReaderCallback callback) throws IOException {
		BufferedReader br = null;
		
		try {
			br = new BufferedReader(new FileReader(filepath));
			int ret = callback.doSomethingWithReader(br);
			return ret;
		}catch(IOException e) {
			System.out.println(e.getMessage());
			throw e;
		}
		finally {
			if(br != null) {
				try { br. close();}
				catch(IOException e) {System.out.println(e.getMessage());}
			}
		}
	}

 

๐Ÿ“„ ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ์„ ์ ์šฉํ•œ calcSum, calcMultiply ๋ฉ”์†Œ๋“œ

public Integer calcSum(String filepath) throws IOException {
		BufferedReaderCallback sumCallback = new BufferedReaderCallback() {
			public Integer doSomethingWithReader(BufferedReader br) throws IOException {
				Integer sum = 0;
				String line = null;
				while((line = br.readLine()) != null) {
					sum += Integer.valueOf(line);
				}
				return sum;
			}
		};
		
		return fileReadTemplate(filepath, sumCallback);

	}
	
	public Integer calcMultiply(String filepath) throws IOException {
		BufferedReaderCallback sumCallback = new BufferedReaderCallback() {
			public Integer doSomethingWithReader(BufferedReader br) throws IOException {
				Integer multiply = 1;
				String line = null;
				while((line = br.readLine()) != null) {
					multiply *= Integer.valueOf(line);
				}
				return multiply;
			}
		};
		
		return fileReadTemplate(filepath, sumCallback);

	}

 

๐Ÿ˜ ์œ„์™€ ๊ฐ™์ด ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด์„ ์ ์šฉํ•ด ๋งŒ๋“  Calculator๋Š” ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ์—†์ด, ์˜ˆ์™ธ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜

์‚ฌ์น™ ์—ฐ์‚ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

โœ๏ธ ์žฅ์  

  • ์ „๋žตํŒจํ„ด์€ ์‚ฌ์šฉํ•˜๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 
  • ํ•˜์ง€๋งŒ ํ…œํ”Œ๋ฆฟ ์ฝœ๋ฐฑ ํŒจํ„ด์€ ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด ์—†์ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ „๋žต์„ ์„ ํƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ๏ธ ๋‹จ์ 

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ DI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉํ•  ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ์–ธํ•˜๋ฏ€๋กœ ๊ฒฐํ•ฉ๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.

 

์ฐธ๊ณ  ๋ฌธ์„œ : 

ํ† ๋น„์˜ ์Šคํ”„๋ง3 (์ด์ผ๋ฏผ)

๋ฐ˜์‘ํ˜•