[객체 지향 프로그래밍 입문 - 인프런] 기능과 책임 분리

김성혁·2021년 2월 6일
1
post-thumbnail

기능 분해

  • 하나의 기능은 여러 하위 기능 이용해서 구현
  • 분리한 하위 기능을 누가 제공할지 결정하는 것 → 객체 지향 설계의 기본 과정

기능을 분리하고 각 객체에게 분리한 기능을 제공할 책임을 배분하는 것 (기능은 곧 책임)

[클래스나 메서드가 커지지 않도록 책임을 분배/분리하는 방법]

  • 패턴 적용
  • 계산 기능 분리
  • 외부 연동 분리
  • 조건별 분리는 추상화

패턴 적용

  • 전형적인 역할 분리

계산 분리

연동 분리

조건 분기는 추상화

(역할 분리 시 의도가 잘 드러나는 이름 사용)

역할 분리와 테스트

  • 역할 분리가 잘 되면 테스트가 용이해짐

분리 연습

public class CashClient {
	private SecretKeySpec ketSpec;
	private IvParameterSpec ivSpec;

	private Res post(Req req) {
		String reqBody = toJson(req);

		Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORM);
		cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
		String encReqBody = new String(Base64.getEncoder().encode(cipher.doFinal(reqBody)));

		ResponseEntity<String> responseEntity = restTemplate.postForEntity(api, encReqBody, String.class);

		String encRespBody = responseEntity.getBody();

		Cipher cipher2 = Cipher.getInstance(DEFAULT_TRANSFORM);
		cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
		String encReqBody = new String(cipher.doFinal(Base64.getDecoder().decode(encRespBody)));

		return jsonToObj(respBody);
	}
}

// 분리
public class CashClient {
	private Cryptor cryptor;

	private Res post(Req req) {
		String reqBody = toJson(req);

		String encReqBoddy = cryptor.encrypt(reqBody);

		ResponseEntity<String> responseEntitiy = restTemplate.postForEntity(api, encReqBody, String.class);
		String encRespBody = cryptor.decrypt(encRespBody);

		return jsonToObj(respBody);
}

public class Cryptor {
	private SecretKeySpec keySpec;
	private IvParameterSpec ivSpec;

	public String encrypt(String plain) {
		Cipher cipher = Cipher.getInstance(DEFAULT_TRANSFORM);
		cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
		return new String(Base64.getEncoder().encode(cipher.doFinal(plain)));
	}

	public String decrypt(String encrypted) {
		Cipher cipher2 = Cipher.getInstance(DEFAULT_TRANSFORM);
		cipher2.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
		return new String(cipher.doFinal(Base64.getDecoder().decode(encrypted)));
	} 

0개의 댓글