엔티티와 @RequestBody를 쓰는 DTO에서 기본 생성자, getter/setter의 필요성 (리플랙션)
2024. 3. 22. 02:02ㆍBackend 취업준비/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)을 위해 리플렉션을 사용
출처
'Backend 취업준비 > Spring' 카테고리의 다른 글
@WebMvcTest를 사용한 Controller 단위 테스트 (1) | 2024.07.15 |
---|---|
@Transactional, 영속성 컨텍스트 (2) | 2024.03.23 |
스프링 시큐리티 (0) | 2024.03.20 |
Servlet Filter, Spring Intercepter (0) | 2024.03.19 |
@ResponseBody, @ModelAttribute, Model 인터페이스 (2) | 2024.03.18 |