본문 바로가기

Java

스프링은 신이고 나는 x신이다.

처음 스프링을 공부할때는 못 느껴봤던 것이었지만 다시 스프링을 보니 이해가 안되는 것이 있었다.

"스프링은 어떻게 인터페이스를 객체처럼 사용하는 것인가?"

인터페이스를 활용해서 추상화된 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신이다.