Backend Language/TDD

[TDD Chapter8] ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ 섀계

chaerlo127 2023. 2. 18. 22:17
728x90

πŸ₯¨ ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μš΄ μ½”λ“œ

κ°œλ°œμ„ μ§„ν–‰ν•˜λ‹€λ³΄λ©΄, ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μš΄ μ½”λ“œλ“€μ„ λ§Œλ‚˜κ²Œ λœλ‹€. ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μš΄ μ½”λ“œλ“€μ€ λ‹€μŒκ³Ό κ°™λ‹€.

1. ν•˜λ“œ μ½”λ”©λœ 경둜
2. 의쑴 객체λ₯Ό 직접 생성
3. 정적 λ©”μ†Œλ“œ μ‚¬μš©
4. μ‹€ν–‰ μ‹œμ μ— 따라 λ‹¬λΌμ§€λŠ” κ²°κ³Ό
5. 역할이 μ„žμ—¬ μžˆλŠ” μ½”λ“œ
6. κ·Έ μ™Έ ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μš΄ μ½”λ“œ

πŸ— ν•˜λ“œ μ½”λ”©λœ 경둜

ν•˜λ“œ μ½”λ”©λœ κ²½λ‘œλΌν•¨μ€ λ‹€μŒκ³Ό 같이 μ½”λ”©λ˜μ–΄ μžˆλŠ” 것을 λœ»ν•œλ‹€.

Path path = Paths.get("D:\\data\\pay\\cp0001.csv");

 

λ‹€μŒκ³Ό 같이 λ˜μ–΄ μžˆλŠ” μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈ ν•˜λ €λ©΄ ν•΄λ‹Ή κ²½λ‘œμ— 파일이 λ°˜λ“œμ‹œ μœ„μΉ˜ν•΄ μžˆμ–΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ, μœˆλ„μš°μ— λ‹€μŒκ³Ό 같은 λ“œλΌμ΄λΈŒκ°€ μ—†κ±°λ‚˜ μœˆλ„μš° μ „μš© 파일 경둜이기 λ•Œλ¬Έμ— λ§₯ OS, λ¦¬λˆ…μŠ€μ—μ„œλŠ” νŒŒμΌμ„ μ—΄ 수 μ—†μ–΄ λ‹€λ₯Έ OSλ₯Ό κ°–κ³  μžˆλŠ” 개발자 λ˜ν•œ ν…ŒμŠ€νŠΈλ₯Ό ν•  수 μ—†λ‹€. 

 

ν•˜λ“œ μ½”λ”©λœ 경둜 뿐만 μ•„λ‹ˆλΌ ν•˜λ“œ μ½”λ”© 된 IP μ£Όμ†Œ, 포트 번호 λ˜ν•œ ν…ŒμŠ€νŠΈλ₯Ό μ–΄λ ΅κ²Œ ν•œλ‹€.

 

 

πŸ— μ˜μ‘΄ 객체λ₯Ό 직접 생성

λ˜ν•œ 의쑴 λŒ€μƒμ„ 직접 μƒμ„±ν•˜λŠ” 것 λ˜ν•œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μ–΄λ €μš΄ 쑰건으둜 λ§Œλ“€κ³  μžˆλŠ” 것이닀. 

public class PaySync{

	// 의쑴 λŒ€μƒμ„ 직접 생성
	private PayInfoDao payinfoDao = new PayInfoDao();
	
    public void sync() throws IOException{
    // μƒλž΅
    payInfos.forEach(pi -> payInfoDao.insert(pi));
    }
}

μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„œλŠ” μ €μž₯된 데이터λ₯Ό μ‚­μ œν•΄μ•Ό ν•˜λŠ”λ° λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ 되면 데이터가 쀑볡이 λ°œμƒν•˜μ—¬ ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ν•˜κ²Œ λœλ‹€. λ‹€ 같이 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , ν•œ 번 μƒμ„±ν•˜κ³  μ§€μ›Œμ•Ό ν•˜λŠ” 객체듀은 ν…ŒμŠ€νŠΈ μ½”λ“œ μ•„λž˜μ— μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€. 

 

πŸ— μ •μ  λ©”μ†Œλ“œ μ‚¬μš©

정적 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.

boolean authorized = AuthUtil.authorize(authkey);


resp = AuthUtil.authenticate(id, pw);

 

μœ„ μ½”λ“œλŠ” AuthUtil 클래슀의 정적 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€. AuthUtil ν΄λž˜μŠ€κ°€ 인증 μ„œλ²„μ™€ ν†΅μ‹ ν•˜λŠ” 경우 μœ„ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈ ν•˜λ €λ©΄ λ™μž‘ν•˜κ³  μžˆλŠ” 인증 μ„œλ²„κ°€ ν•„μš”ν•˜λ‹€. λ”°λΌμ„œ ν΄λž˜μŠ€κ°€ 톡신할 인증 μ„œλ²„ 정보λ₯Ό μ‹œμŠ€ν…œ ν”„λ‘œνΌν‹°μ—μ„œ κ°€μ Έμ˜¨λ‹€λ©΄ μ‹œμŠ€ν…œ ν”„λ‘œνΌν‹°λ„ ν…ŒμŠ€νŠΈ ν™˜κ²½μ— 맞게 μ„€μ •ν•΄μ•Όν•˜λ©°, 인증 μ„œλ²„μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μœ μš”ν•œ 아이디와 μ•”ν˜Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

 

πŸ— μ‹€ν–‰ μ‹œμ μ— 따라 λ‹¬λΌμ§€λŠ” μ½”λ“œ

LocalDate now = LocalDate.now();

 

λ‹€μŒκ³Ό 같은 μ½”λ“œκ°€ μžˆμ„ λ•Œ, ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ‹œκ°„μ— 따라 ν…ŒμŠ€νŠΈμ˜ κ²°κ³Όκ°€ λ‹¬λΌμ§€λ―€λ‘œ ν…ŒμŠ€νŠΈλ₯Ό 믿을 수 μ—†κ²Œ λœλ‹€. 이와 같이 Random의 κ²½μš°μ—λ„, μƒμ„±ν•˜λŠ” κ²°κ³Ό 값이 랜덀으둜 λ‚˜μ˜€κ²Œ λ˜λ―€λ‘œ LocalDate와 같이 믿을 수 μ—†λŠ” 상황이 λ°œμƒν•  수 μžˆλ‹€. 

 

 

πŸ— μ—­ν• μ΄ μ„žμ—¬ μžˆλŠ” μ½”λ“œ

포인트 κ³„μ‚°μ˜ λ‘œμ§μ„ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•œ μ½”λ“œμ—μ„œλŠ” 둜직만 가지고 ν…ŒμŠ€νŠΈλ₯Ό 진행할 수 μ—†λ‹€. ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” DB에 μ ‘κ·Όν•˜λŠ” Dao에 λŒ€ν•œ λŒ€μ—­μ„ κ΅¬μ„±ν•΄μ•Όν•œλ‹€.

 

 

πŸ—  κ·Έ μ™Έ ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μš΄ μ½”λ“œ

  • λ©”μ„œλ“œ 쀑간에 μ†ŒμΌ“ 톡신 μ½”λ“œκ°€ 포함
    • μ†ŒμΌ“ ν†΅μ‹ μ΄λ‚˜ HTTP 톡신은 μ‹€μ œ λŒ€μ²΄ν•  μ„œλ²„λ₯Ό λ‘œμ»¬μ— λ„μ›Œμ„œ 처리 κ°€λŠ₯, μ„œλ²„ μˆ˜μ€€μ—μ„œ λŒ€μ—­μ„ μ‚¬μš©ν•œλ‹€κ³  생각
  • μ½˜μ†”μ— μž…λ ₯λ°›κ±°λ‚˜ κ²°κ³Όλ₯Ό μ½˜μ†”μ— 좜λ ₯
  • ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ μ‚¬μš©ν•˜λŠ” 의쑴 λŒ€μƒ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œκ°€ final -> λŒ€μ—­μœΌλ‘œ λŒ€μ²΄κ°€ μ–΄λ €μšΈ 수 있음
  • ν…ŒμŠ€νŠΈ λŒ€μƒμ˜ μ†ŒμŠ€λ₯Ό μ†Œμœ ν•˜κ³  μžˆμ§€ μ•Šμ•„ μˆ˜μ •μ΄ 어렀움
728x90

πŸ₯¨ ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ 섀계

ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μš΄ 주된 μ΄μœ λŠ” μ˜μ‘΄ν•˜λŠ” μ½”λ“œλ₯Ό ꡐ체할 수 μžˆλŠ” μˆ˜λ‹¨μ΄ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ, λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό κ΅μ²΄ν•˜λ©΄μ„œ ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•œ μ„€κ²Œλ‘œ λ³€κ²½ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

1. ν•˜λ“œ μ½”λ”©λœ μƒμˆ˜λ₯Ό μƒμ„±μžλ‚˜ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ λ°›κΈ°
2. 의쑴 λŒ€μƒμ„ μ£Όμž… λ°›κΈ°
3. ν…ŒμŠ€νŠΈν•˜κ³  싢은 μ½”λ“œ λΆ„λ¦¬ν•˜κΈ°
4. μ‹œκ°„μ΄λ‚˜ μž„μ˜ κ°’ 생성 κΈ°λŠ₯ λΆ„λ¦¬ν•˜κΈ° 
5. μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ°μ‹Έμ„œ μ‚¬μš©ν•˜κΈ°

 

πŸ—  ν•˜λ“œ μ½”λ”©λœ μƒμˆ˜λ₯Ό μƒμ„±μžλ‚˜ λ©”μ„œλ“œ νŒŒλΌλ―Έν„°λ‘œ λ°›κΈ°

ν•˜λ“œ μ½”λ”©λœ κ²½λ‘œκ°€ ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μš΄ μ΄μœ λŠ” ν…ŒμŠ€νŠΈ ν™˜κ²½μ— 따라 경둜λ₯Ό λ‹€λ₯΄κ²Œ 쀄 수 μžˆλŠ” μˆ˜λ‹¨μ΄ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ, μƒμˆ˜λ₯Ό μ‰½κ²Œ ꡐ체할 수 μžˆλŠ” κΈ°λŠ₯을 μΆ”κ°€ν•˜λ©΄ λœλ‹€. 

public class PaySync{
	private String "D:\\data\\pay\\cp0001.csv"
    public void setFilePath(String filePath){
    	this.filePath = filePath;
	}
}

 

파일 경둜λ₯Ό λ³€κ²½ν•˜λŠ” 또 λ‹€λ₯Έ 방법은 λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ 인자둜 μ „λ‹¬λ°›λŠ” 것이닀.

public class PaySync{
	private String "D:\\data\\pay\\cp0001.csv"
    
    public void sync(String filePath) throws IOException{
    	Path path = Paths.get(filePath);
	}
}

 

 

πŸ—  μ˜μ‘΄μ„± μ£Όμž… λ°›κΈ°

의쑴 λŒ€μƒμ€ μ£Όμž…λ°›μ„ 수 μžˆλŠ” μƒμ„±μžλ‚˜ Setter μˆ˜λ‹¨μ„ μ œκ³΅ν•΄μ„œ ꡐ체할 수 μžˆλ„λ‘ ν•œλ‹€. 이λ₯Ό 톡해, 의쑴 λŒ€μƒμ„ ꡐ체할 수 있게 되면 μ‹€μ œ κ΅¬ν˜„ λŒ€μ‹ μ— λŒ€μ—­μ„ μ‚¬μš©ν•  수 있게 λ˜μ–΄ ν…ŒμŠ€νŠΈλ₯Ό 보닀 μ›ν™œν•˜κ²Œ μž‘μ„±ν•  수 있게 λœλ‹€. 

public class PaySync{
	// μƒμ„±μž μΆ”κ°€ ν˜Ήμ€
    public PaySync(PayInfoDao payInfoDao){
    	this.payInfoDao = payInfoDao;
	}
    
    // setter μΆ”κ°€
    public void setPayInfoDao(PayInfoDao payInfoDao){
    	this.payInfoDao = payInfoDao;
	}
}

 

πŸ—  ν…ŒμŠ€νŠΈν•˜κ³  싢은 μ½”λ“œ λΆ„λ¦¬ν•˜κΈ°

μ½”λ“œ 쀑에 κΈ°λŠ₯ μΌλΆ€λ§Œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜κ³  싢은 것이 μžˆλ‹€λ©΄ κ·Έ μ½”λ“œλ₯Ό 별도 κΈ°λŠ₯으둜 λΆ„λ¦¬ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό 진행할 수 μžˆλ‹€.

 

 

πŸ—  μ‹œκ°„μ΄λ‚˜ μž„μ˜ κ°’ 생성 κΈ°λŠ₯ λΆ„λ¦¬ν•˜κΈ°

ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ μ‹œκ°„μ΄λ‚˜ μž„μ˜μ˜ 값을 μ‚¬μš©ν•˜λ©΄ ν…ŒμŠ€νŠΈ μ‹œμ μ— 따라 ν…ŒμŠ€νŠΈ κ²°κ³Όκ°€ 달라진닀.  이 λ•Œ, ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ μ‚¬μš©ν•˜λŠ” μ‹œκ°„μ΄λ‚˜ μž„μ˜μ˜ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 λΆ„λ¦¬ν•˜μ—¬ ν…ŒμŠ€νŠΈμ˜ κ°€λŠ₯성을 λ†’μ—¬μ•Ό ν•œλ‹€. 

 

πŸ—  μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  κ°μ‹Έμ„œ μ‚¬μš©ν•˜κΈ°

ν…ŒμŠ€νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 정적 λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€λ©΄ μ‰½κ²Œ λŒ€μ²΄ν•  수 μ—†λ‹€. 

boolean authorized = AuthUtil.authorize(authkey);


resp = AuthUtil.authenticate(id, pw);

 

λ‹€μŒκ³Ό 같은 μ½”λ“œλŠ” 정적 λ©”μ†Œλ“œμ΄κΈ° λŒ€λ¬Έμ— λŒ€μ—­μœΌλ‘œ λŒ€μ²΄ν•˜κΈ° μ–΄λ ΅λ‹€. λ”°λΌμ„œ, μ™ΈλΆ€ 라이브러리λ₯Ό 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , μ™ΈλΆ€ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ μ—°λ™ν•˜κΈ° μœ„ν•œ νƒ€μž…μ„ μƒˆλ‘œ λ§Œλ“ λ‹€. 그리고 ν…ŒμŠ€νŠΈ λŒ€μƒμ€ λΆ„λ¦¬ν•œ νƒ€μž…μ„ μ‚¬μš©ν•˜κ²Œ λ§Œλ“ λ‹€. 

 

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μƒˆλ‘œ λΆ„λ¦¬ν•œ νƒ€μž…μ„ μƒμ„±ν•¨μœΌλ‘œμ¨ μ™ΈλΆ€ 연동이 ν•„μš”ν•œ κΈ°λŠ₯을 μ‰½κ²Œ λŒ€μ—­μœΌλ‘œ ꡐ체할 수 μžˆλ‹€. 

 

public class AuthService{
	private String = "somekey";
    
    public int authenticate(String id, String pw){
    	boolean authorized = AuthUtil.authorize(authKey);
        if(authorized){
        	return AuthUtil.authenticate(id, pw);
        }else {
        	return -1;
		}
	}
}

 

 

728x90