처음 스프링을 공부할때는 못 느껴봤던 것이었지만 다시 스프링을 보니 이해가 안되는 것이 있었다.
"스프링은 어떻게 인터페이스를 객체처럼 사용하는 것인가?"
인터페이스를 활용해서 추상화된 Service 레이어를 사용하는데 어떻게 컨트롤러 단에서 서비스를 호출 할 수 있었던 것인가?
예시를 보자
Controller
@RestController
public class Controller {
@Autowired
private Service service;
@GetMapping("/")
public ResponseEntity<String> Main() throws Exception {
String data = service.main();
return ResponseEntity.status(HttpStatus.OK).body(data);
}
}
Service
public interface Service {
String main() throws Exception;
}
ServiceImpl
@Service
public class LoginServiceImpl implements LoginService {
@Override
public String main() throws Exception {
return("메인 페이지")
}
}
이런 방식으로 구현이 되어 있을 때 어떻게 컨트롤러에서 Service 객체를 만들 수 있는 것인지 모르겠다.
내가 아는 interface는 객체로 구현할 수 없다고 알고 있는데 컨트롤러에서 보면 객체로서 사용 중 인 것 같다.
실제로 저게 가능한건지 이리저리 똥꼬쇼를 해보았지만 실패하였다.
저것의 정답은 프록시 객체라는 것 때문에 가능한 것 이었다.
간단히 이야기 하자면 서비스 앞에 서비스 프록시 객체가 존재하고, 서비스 프록시 객체는 serviceImpl을 가르키고 있는 것 이었따.
프록시 객체는 Spring이 AOP를 지원하기 위해 만들어진 개념(?)으로 스프링에는 정말 다양한 디자인 패턴들이 존재하고 이걸 어떻게 구현한건가 싶은 기능들이 많은 것 같다.
다시 한번 느끼지만 스프링은 신이고 나는 x신이다.
'Java' 카테고리의 다른 글
Spring Cloud Gateway 기본적인 사용 방법 (0) | 2024.06.12 |
---|---|
자바 프로세스 메모리 증가 (0) | 2024.06.01 |
자바 멀티 스레드 프로그래밍 (0) | 2024.05.20 |
Java float와 double의 부동소수점 연산 차이 (0) | 2024.05.18 |
숫자 야구 코딩 테스트(Java) (0) | 2023.06.12 |