수행문을 반복하며 탈출조건에 따라 반복을 중지하게 된다는 점에서 재귀 함수는 while 반복문과 비슷하다고 할 수도 있지만 여러가지 차이점이 있습니다.
첫번째로 반복의 종료과정에서 차이가 있습니다.
while의 경우 조건식인 boolean타입을 통해 수행식을 더 진행할지 말지를 즉시 판단하고 멈추지만 재귀 함수의 경우 조건식을 통해 자기자신인 메서드를 다시 호출하지 않고 값을 return해 이전단계의 재귀 수행식으로 돌아가는 것을 반복하며 모든 식을 전부 수행하고 멈춥니다. 즉, 재귀는 조건식을 통해 즉시 멈추는 것이 아니라 반복의 마무리에 들어간다고 표현할 수 있습니다.
정리하자면
두번째로 사용하는 메모리의 차이점이 있습니다.
재귀함수는 함수를 반복적으로 호출하기 때문에 스택 메모리를 사용하고 반복문들은 힙메모리를 사용합니다.
재귀 함수는 재귀할 때마다 지역변수, 매개변수, 반환값을 모두 stack에 저장하게 됩니다. 따라서 반복문에 비해 리소스 사용량이 많고 이로 인해 실행 속도가 상대적으로 느립니다.
(기본적으로 값을 할당하는 것은 스택 메모리가 더 빠르지만 재귀와 반복문의 차이에 있어서는 사용하는 리소스량의 차이가 메모리 속도차이를 상회하기 때문에 재귀가 더 느린 것입니다.)
세번째로 변수 사용량의 차이가 있습니다.
여기서 말하는 변수 사용량은 메모리에 대한 이야기가 아니라 사용하는 변수의 갯수나 변수가 변경될 수 있는 상황에 노출되는 횟수를 말하는 것 입니다.
반복문의 경우 반복 과정에서 기존 변수값이 변경되지 않도록 새로운 변수를 선언해 사용해야하거나 for의 경우에서 반복 횟수를 지정하기 위해서 변수를 추가하는 등 사용하는 변수의 갯수가 재귀함수에 비해 상대적으로 많습니다. 따라서 사용하는 변수의 갯수가 적은 재귀함수가 상대적으로 간결한 코드라고 할 수 있습니다.
또 재귀함수의 경우 자기 자신인 메서드를 호출하기 때문에 변수 값의 종류나 범위를 제한할 수 있게 됩니다. 따라서 변수 사용량이 반복문에 비해 상대적으로 적어 의도치 않은 변수 변경 가능성을 줄일 수 있습니다.
정리하자면 상대적으로 재귀함수는 상대적으로 코드가 간결하여 가독성이 좋으며 의도치 않은 변수의 변경을 제한할 수 있다는 장점이 있지만 메모리를 많이 사용해 속도가 느리고
반복문은 속도가 빠르지만 코드가 복잡해 가독성이 떨어지며 예상치 못한 변수 변경 가능성이 높다고 할 수 있겠습니다.
재귀 함수 | 반복문 | |
---|---|---|
장점 | - 상대적으로 간결한 코드 | - 속도가 상대적으로 빠름 |
단점 | - 메모리를 많이 사용함 - 속도가 상대적으로 느림 |
- 상대적으로 복잡한 코드 |
CORS 이슈는 교차 출처 리소스 공유 정책을 위반할 때 발생하는 이슈입니다.
웹 브라우저는 보안의 이유로 동일 출처 정책을 따르고 있습니다.
동일 출처 정책은 말 그대로 "동일한 출처에서만 리소스를 공유할 수 있다."라는 의미입니다. A라는 웹페이지에 접속해서 특정 리소스를 얻기 위해 요청을 보냈는데 B라는 웹페이제에서 리소스를 보내주는게 가능하다면 제3자가 개입해 원하지 않는 악성파일들을 몰래 보낼 수 있는 구조가 됩니다. 따라서 보안을 위해 동일 출처 정책을 지켜야 하고 이를 위반 했을 때 요청을 차단하는 것입니다.
보안을 위해서는 동일 출처 정책을 따르는 것이 가장 좋은 방법이겠지만 어쩔 수 없이 다른 출처 간의 상호작용이 필요한 경우가 많습니다. 따라서 교차 출처 리소스 공유(즉, CORS)를 사용하게 되는데, 헤더에 교차출처로 허용할 주소를 명시해 주는 방식으로 사용하게 됩니다. 이때, 주소 명시가 없으면 동일 출처 정책에 따라 리소스 요청이 차단되면 CORS 오류가 발생하는 것 입니다.
따라서 외부 주소에서 리소스를 가져올 때는 응답 헤더에 해당 외부주소의 주소를 포함시켜 응답하는 방식으로 CORS오류를 해결할 수 있습니다.
URI와 URL 차이점
간단하게 URI= 식별자, URL=식별자+위치
라고 할 수 있습니다.
즉, URL은 일종의 URI라고 할 수 있는 포함관계입니다.
(위치정보 scheme이 없이 식별자만 있으면 URI라고는 할 수 있지만 URL이라고 할 수는 없다.)
Dependency Injection이란 말 그대로 클래스간의 의존성을 클래스 외부에서 주입하는 것입니다. 자바에서 사용하던 상속개념과 같이 같은 기능을 포함하도록 요하는 클래스에서 똑같은 코드를 반복해서 작성할 필요 없이 인터페이스화를 통해 사용하고 유연성을 증가 시킬 수 있는 방법인 것입니다.
의존성 주입 자체는 강한결합에서도 가능하긴 하지만 애플리케이션 코드 내부에서 직접적으로 new 키워드를 사용할 경우 객체지향 설계의 관점에서 문제가 발생할 수 있기 때문에 new 키워드 사용하지 않으며 의존성 주입을 하도록 지양하는 등 느슨한 결합 상태로 의존성을 주입하도록 지양합니다.
따라서 의존성 주입을 할 때 제어의 역전을 이용해 클래스간의 직접적인 의존성 부여를 피하고 매개체를 이용해 의존성 부여하게 됩니다.
이때 매개체를 주로 framework가 담당하고 IOC 컨테이너라고 부릅니다.
이 IOC컨테이너는 일임받은 제어권을 사용하여 의존성을 관리하고, 인스턴스를 생성해서 주입해주고, 메모리를 해제하는 역할까지 해줍니다.
이를 통해 의존성을 줄여 코드의 유연성을 증가시키고 유지보수가 쉽게 할 수 있습니다.
정리하자면 앞서 언급한 방식으로 의존성 부여를 함으로써 코드의 양을 줄이고 유지보수가 쉽게 하며 테스트하기 용이하게 만들 수 있다는 장점들이 생깁니다.
Q14. Spring에서 AOP가 필요한 이유에 대해 설명해주세요.
Q: OOP의 모듈화와 AOP의 모듈화의 차이는?
OOP : 비즈니스 로직의 모듈화
모듈화의 핵심 단위는 비즈니스 로직.
AOP : 인프라, 부가기능의 모듈화
로깅, 트랜잭션, 보안 등등.
각각의 모듈들의 주 목적 외에 필요한 부가적인 기능.