쏙쏙 들어오는 함수형 코딩 - #7

_sw_·2023년 8월 16일
post-thumbnail

방어적 복사를 활용하면 카피-온-라이팅의 원칙을 지키면서 안전하게 함수를 사용할 수 있다.

방어적 복사는 데이터의 원본이 바뀌는 것을 완벽하게 막아주는 역할을 한다. 방어적 복사는 불변성이 지켜지는 안전지대로 데이터의 원본, 복사본을 이동시킴으로서 변하는 데이터에 대해서 안전하게 데이터를 주고 받을 수 있다.

방어적 복사 규칙

  1. 데이터가 안전한 코드에서 나갈때 복사하기

    변경 불가능한 데이터가 신뢰할 수 없는 코드로 나갈때 데이터를 깊은 복사로 복사본을 만들고, 해당 복사본을 전달한다.

  2. 안전한 코드로 데이터가 들어올 때 복사하기

    신뢰할 수 없는 코드에서 변경 가능성이 있는 데이터가 들어올때 깊은 복사본을 만들어 안전한 코드로 전달한다.

연습문제 solve

// payrollCalcSafe() 방어적 복사가 적용된 함수 만들기
function payrollCalcSafe(employee) {
	const employee_copy = deepCopy(employee);
	const payRollChecks = payrollCalc(employee_copy);
	return deepCopy(payRollChecks);
}
// 방어적 복사 적용하기
userChanges.subscribe(function(user) {
	...
	const user_copy = deepCopy(user);
	processUser(user_copy);
	// 나가는 데이터가 없기 때문에 추가로 복사할 필요가 없다.
})

이미 쓰이고 있었던 방어적 복사

  • 웹 API
    API 요청을 통해 JSON 데이터가 들어오면, 이때 전달받는 JSON 데이터는 깊은 복사본이다. 방어적 복사를 통해 서로 다른 코드와 원칙을 가진 서비스들이 문제없이 통신 가능하다.
  • Erlang 과 Elixir ( 함수형 프로그래밍 언어의 종류)

카피-온-라이트와 깊은 복사

깊은 복사는 모든 계층에 대해 중첩된 데이터를 모두 복사하기 떄문에 얕은 복사에 비해 비용이 많이든다. 안전지대 내에서는 모든 계층에 대한 복사가 필요없기 때문에 비교적 복사 비용이 많이 들지 않는 카피-온-라이트를 활용하는 것이 성능상 이점을 가질 수 있다. 그래서 카피-온-라이트와 깊은 복사 모두 적절하게 사용되어야 한다.

카피-온-라이트깊은복사
언제통제할 수 있는 데이터를 바꿀 때신뢰할 수 없는 코드와 데이터를 주고 받을 때
어디서안전지대 내에서안전지대의 경계에서 데이터가 오고가는 곳에서
복사방식얕은 복사깊은 복사
규칙1. 바꿀 데이터의 복사본을 만든다.(얕은복사)
2. 복사본을 변경한다.
3. 복사본을 리턴한다.
1. 안전지대로 들어오는 데이터의 복사본을 만든다. (깊은 복사)
2. 안전지대에서 나가는 데이터의 복사본을 만든다.

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

정보 감사합니다.

답글 달기