엔티티와 @RequestBody를 쓰는 DTO에서 기본 생성자, getter/setter의 필요성 (리플랙션)

2024. 3. 22. 02:02Backend 취업준비/Spring

엔티티

  • 데이터베이스의 테이블과 매핑 하기 위해 기본 생성자 필요 getter/setter 둘 중 하나 필요
  • 엔티티 클래스에서 setter은 지양되니 getter 권장
  • JPA 구현체(예: Hibernate)가 내부적으로 리플렉션 개념을 사용하여 매핑을 수행

 

 @RequestBody를 쓰는 DTO

  • JSON 객체의 필드를 Java 객체의 필드에 매핑 하기 위해 기본 생성자 필요 getter/setter 둘 중 하나 필요
  • Jackson 라이브러리의 ObjectMapper가 내부적으로 리플랙션 개념을 사용하여 매핑을 수행

 

 

리플랙션이란?

 

프로그램 실행중(런타임)에 사용자와 운영체제 및 기타 프로그램과 상호작용 하면서 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능

  • 자바 소스 파일을 컴파일하면 클래스 로더를 통해 method area에 클래스가 로드된다
  • 이때 method area에 로드된 클래스의 메타정보가 담긴다

 

  • method area 클래스의 메타정보를 가지고 런타임에 클래스를 검사하고 조작할 수 있도록 하는 것이 리플랙션

 

리플랙션 사용법

 

Class 클래스는 Java 리플렉션의 핵심, 클래스의 메타데이터를 표현. 이 클래스를 사용하여 클래스의 정보를 가져오고 조작할 수 있다

 

리플랙션으로 얻을 수 있는 정보

  • 필드, 메서드, 생성자
  • ANNOTATION, ENUM, 배열, 부모 클래스 & 인터페이스 등

Class사용

//클래스 리터럴
Class<MyClass> class = MyClass.class;

//new연산자로 만든 인스턴스 변수에 .getClass()
MyClass obj = new MyClass();
Class<MyClass> class = obj.getClass();

//Class.forName("풀 패키지 경로") 사용
Class<MyClass> clazz = Class.forName("com.example.MyClass");

 

 

 

리플렉션은 왜?

 

리플랙션 단점

 

  • 보안 취약성: 리플렉션은 프로그램의 런타임 구조를 동적으로 조작할 수 있는 기능을 제공하기 때문에 보안 취약성을 초래할 수 있다. 악의적인 사용자가 리플렉션을 사용하여 private 멤버에 접근하거나 보안 제약을 우회할 수 있다.
  • 코드 복잡성: 리플렉션을 사용하면 코드가 복잡해질 수 있다. 리플렉션은 정적으로 알려진 타입을 사용하는 것보다 동적으로 클래스 및 멤버를 조작하는 방식이므로 코드의 읽기 및 이해가 어려워질 수 있다.
  • 성능 저하: 리플렉션은 일반적인 메서드 호출보다 더 많은 오버헤드가 발생할 수 있다. 리플렉션을 사용하여 메서드를 호출하거나 필드에 접근하는 것은 정적인 방식보다 느릴 수 있다.
  • 최적화 방해: 리플렉션은 코드의 최적화를 방해할 수 있다. 컴파일러가 코드를 최적화할 때, 정적으로 알려진 메서드나 필드에 대해서는 더 효율적인 방식으로 처리할 수 있지만, 리플렉션을 사용하는 경우에는 최적화하기 어려울 수 있다.
  • 컴파일 시점에 타입 안정성 체크 불가: 리플렉션을 사용하면 컴파일 시점에 타입 안정성을 체크할 수 없다. 따라서 잘못된 클래스나 메서드를 참조하는 경우 런타임 에러가 발생할 수 있다.

 

 

그럼에도 불구하고 리플렉션을 사용하는 이유?

 

  • 유연성: 리플렉션을 사용하면 프로그램이 런타임 시에 동적으로 클래스를 로드하고 조작할 수 있다. 이는 유연성을 제공하며, 플러그인 시스템이나 프레임워크에서 유용하게 사용될 수 있다.
  • 메타프로그래밍: 리플렉션은 메타프로그래밍에 유용합니다. 예를 들어, 자동화된 테스트 프레임워크나 객체 직렬화 라이브러리 등의 도구를 개발할 때 리플렉션을 사용하여 객체의 구조를 분석하고 조작할 수 있다.
  • 리플렉션을 요구하는 프레임워크 및 라이브러리: 일부 프레임워크나 라이브러리는 리플렉션을 요구한다. 예를 들어, Spring 프레임워크에서는 의존성 주입(Dependency Injection)을 위해 리플렉션을 사용

 

 

출처

https://www.youtube.com/watch?v=67YdHbPZJn4

https://www.youtube.com/watch?v=67YdHbPZJn4