인프런 커뮤니티 질문&답변

mayo3610님의 프로필 이미지

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

6강. POST API 개발하고 테스트하기

어떻게 생성자 없이 number1과 number2에 값이 할당된건지 모르겠습니다.(DTO관련)

해결된 질문

작성

·

507

6

스크린샷 2023-11-30 오전 10.28.53.png안녕하세요 강사님먼저 첫번째 질문은 DTO (CalculatorMultiplyRequest request)를 매개변수로 받는 데, 자동으로 request 인스턴스가 생성되는 것이 이해가 가지 않습니다. 클래스는 생성자를 호출하기 위해서는 new키워드로 생성해야 하는 것으로 알고있는데, 이해가 잘 되지 않습니다.두번째 질문은 GET요청과는 다르게 POST요청은 Request 클래스 내부에 생성자 없이도 number1과 number2에 값이 할당되는 점입니다.어떻게 이게 가능할 수 있죠..?

답변 1

3

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, mayo3610님! 정말 좋은 질문 감사드립니다~ 😊

질문 주신 내용에 대해 하나씩 답변 드려 볼게요!!!!

 

[1] DTO (CalculatorMultiplyRequest request)를 매개변수로 받는 데, 자동으로 request 인스턴스가 생성되는 것이 이해가 가지 않습니다

크으~~ 정말 좋은 질문입니다~ 👍

사실 Java 언어에서 우리가 어떤 객체를 받는 함수를 호출하려면, 말씀해주신 것처럼 new 연산자를 사용해 객체를 만든 후 함수를 호출할 때 넣어 주어야 하죠.

// 대략적인 느낌 입니다!
CalculatorMultiplyRequest request = new CalculatorMultiplyRequest(xxx, yyy);
controller.invoke(request);

하지만 우리는 Controller 코드에 매개변수로 CalculatorMultiplyRequest 를 지정했을 뿐인데, API가 호출되면 자동으로 해당 객체의 인스턴가 생성되어 함수가 불리게 됩니다.

그 비밀은 바로 "스프링"에 있습니다. 우리가 프로그램을 개발할 때 "프레임워크"를 사용하는 이유이기도 한데요, "스프링" 내부에서 API 요청을 받으면 API의 URL은 무엇인지, HTTP Method는 무엇인지 확인해 적절한 Controller 클래스와, Controller 내부의 함수를 특정한 후 필요한 매개변수를 스프링이 직접 인스턴스화 하여 넣어주게 됩니다.

만약 스프링을 사용하지 않았다면, API 요청을 직접 받는 부분부터, HTTP 문법을 파싱하고, 우리의 로직과 연결하는 모든 코드를 직접 작성해야 했을 거에요!

한 줄 요약 드려보자면, "스프링이 해준다" 라고 보시면 되겠습니다.

관련해서 더 공부해보고 싶으시다면, "Spring MVC" 라는 키워드로 다양한 글을 읽어보시면 좋을 것 같습니다! 🙂

 

[2] 두번째 질문은 GET요청과는 다르게 POST요청은 Request 클래스 내부에 생성자 없이도 number1과 number2에 값이 할당되는 점입니다.어떻게 이게 가능할 수 있죠..?

이 역시 정말 좋은 질문입니다~ 👍 위의 답변에서, 인스턴스화를 스프링이 해준다고 하더라도 생성자를 만들지도 않았는데, 값이 정상적으로 들어 있는 인스턴스가 생기는 것이 이상하게 느껴질 수 있죠!!!

비밀은 자바의 "리플렉션" 이라는 기능에 있습니다. "리플렉션 (Reflection)" 이란 Java 코드가 실행중인 상황에서, 특정 클래스에 대한 정보를 가져와, 인스턴스를 만들거나, 필드의 목록을 불러오거나, 필드에 값을 넣어주는 등의 작업을 할 수 있는 기능을 말해요. 매개변수를 인스턴스화 하여 함수에 넣어주는 과정에서 리플렉션을 활용하면, private 변수에도 값을 직접 할당할 수가 있게 됩니다.

혹시나 더 궁금하시다면, "자바 리플렉션 API" 라는 키워드로 검색해 보시고, 몇 가지 코드를 따라서 실습해보시면, 리플렉션이라는 기술이 어떤 느낌인지 확 와닿으실 거에요~

 

답변이 도움이 되었으면 좋겠습니다!!

또 궁금한 점 있으시면 편하게 질문 주세요~ 감사합니다! 🙏 🙏

mayo3610님의 프로필 이미지
mayo3610
질문자

친절한 답변 감사드립니다 🫡 정말 재밌게 강의 듣고있어요 😀

mayo3610님의 프로필 이미지

작성한 질문수

질문하기