본문 바로가기
개발 일기장/개발 일지

20250220 TIL

by 룰루루 2025. 2. 20.

✅ 궁금한 점 / 복습 포인트

✔️ Jest와 같은 툴은 테스트 '라이브러리'일까, '프레임워크'일까? 그리고 이런 테스팅 도구들의 동작원리는 어떻게 될까?

 
추측
테스팅 프레임워크이다. 왜냐하면 라이브러리는 여러 기능이 있는 코드 모듈을 제공하고 코드의 제어권은 개발자가 갖는 반면 프레임워크는 코드의 제어권을 해당 프레임워크에 위임한다고 알고 있다. 만약 프레임워크라면 동작원리는 프레임워크와 같다고 알고 있다(but 프레임워크의 동작원리도 잘 모름).
 
새롭게 알아낸 것
테스팅 프레임워크가 맞다. 프레임워크를 사용해서도 개발자는 코드를 작성할 수 있지만, 개발자가 작성한 코드를 실행하는 주체는 프레임워크라고 한다. 

 

✔️ 프레임워크는 어떻게 코드의 제어권을 가져올까? 프레임워크도 결국은 코드의 집합체가 아닌가? 어떻게 코드의 집합체만으로 코드의 제어권을 가져올 수 있을까?

 

추측

잘 모르겠다... 감이 안 온다. 

 

새롭게 알아낸 것

크게 세 가지의 방식으로 제어권을 가져온다고 한다. 

  1. 콜백 패턴(callback pattern)
  2. 의존성 주입(DI, dependency injection)
  3. 메타 프로그래밍(meta programming)

'콜백 패턴'은 함수를 인자로 전달하고, 특정 시점에 실행하도록 하는 프로그래밍 기법이라고 한다. '콜백 함수'라는 용어를 알지만 정확히 설명하지는 못하는데 이 함수가 작동하는 원리와 같은 패턴인 것이라고 이해했다. 콜백함수가 무엇인지 찾아보니 '다른 함수에 인자로 전달되어 나중에 실행되는 함수'라고 했다. 코드로도 예시를 찾아봤다. GPT한테 Django 코드로 예시를 달라고 했더니 잘 해주더라.

 

콜백 패턴의 예시는 다음과 같다. 우선 콜백 패턴을 사용하지 않는 경우를 보자. 이 경우는 함수를 직접 호출한다. 

def say_hello():
    print("Hello")

say_hello()

 

반면 콜백을 사용하는 경우, 다음과 같이 호출 시점을 결정할 수 있다. 프레임워크의 코드는 이런 방식으로 함수의 호출 시점을 결정한다고 이해했다. 

def execute_callback(callback):
    print("before calling callback")
    callback()
    print("after calling callback")
    
execute_callback(say_hello)

 

의존성 주입의 경우는 Django가 view를 호출할 때의 예시가 있다고 한다. 보통 urls.py 파일의 urlpatterns 라는 변수에다가 view를 등록하면 해당 url이 호출되었을 때 해당 view 함수가 실행된다. 예제 코드를 보니 이해가 되었다. 

class DjangoApp:
    def __init__(self):
        self.routes = {}

    def add_route(self, path, view_func):
        self.routes[path] = view_func

    def handle_request(self, path, request):
        if path in self.routes:
            return self.routes[path](request)  # 여기서 우리가 작성한 뷰 함수 실행
        else:
            return HttpResponse("404 Not Found")

app = DjangoApp()
app.add_route("/hello/", hello_view)

fake_request = {}
response = app.handle_request("/hello/", fake_request)
print(response.content)  # "Hello, World!"

 

add_route() 메소드를 통해서 routes의 N번째 인자에 view 함수를 등록하고, handle_request() 메소드를 통해서 add_route에서 등록한 view 메소드를 실행한다. 왜냐하면 add_route는 view_func라는 view 함수를 받아서 routes라는 클래스 변수의 path번째 값으로 등록해 두고, handle_request라는 함수가 실행되면 request라는 인자를 받아서 그 view 함수의 인자로 건네주기 때문이다. 

 

그리고 meta programming에 대해서도 알아보려고 했는데, 비단 django에만 적용되는 것이 아니라 더 깊은 개념인 것 같았다. 그래서 해당 개념에 대해 아직은 더 알아보지는 못했다. 다음 기회에 알아보자!

 

✅ 해결되지 않은 궁금증들

  • mocking이 왜 필요할까? 문서에는 '테스트 대상이 준비되지 않았거나 직접 테스트할 수 없는 상황'을 얘기했는데, 그런 예시가 있을까?
  • mocking을 어떻게 할까? mocking도 테스트 프레임워크가 하는 '흐름제어'에 포함될까?
  • jest를 보면 toHaveBeenCalled와 같은 메소드가 있는데 특정 변수들이 이미 혹은 몇 번씩 호출되었는지는 어떻게 알까?
  • 프론트엔드에서 테스트를 짤 때 전적으로 개발자의 재량에 의존할까? 아니면 문서를 만드는 것이 일반적일까? 문서를 만든다면 무엇을 기준으로 어떤 테스트를 할지를 판단할까?
  • 메타 프로그래밍(meta programming)이란 무엇일까?

 

'개발 일기장 > 개발 일지' 카테고리의 다른 글

20250224 TIL  (0) 2025.02.24
20250221 TIL  (0) 2025.02.21
20250219 TIL  (0) 2025.02.19
20250218 TIL  (0) 2025.02.18
0822 이메일 폼 만들기  (0) 2022.08.23