어노테이션을 이용한 객체생성

1 minute read

xml에서 객체를 생성하던 부분을 Annotation을 통해 만들 수 있도록 바꿔볼 것임

image

xml에서 InlineExamConsole이라는 객체를 생성하는 부분을 지우고 해당 클래스의 윗부분에 @Component라는 Annotation을 지정해줘 객체가 자동으로 생성될 수 있게 해줌. 단, xml에서는 객체가 생성된다는 내용이 없으므로 단순하게 @Component만 쓰는 것이 아닌 @Autowired Annotation처럼 설정이 필요함. component-scan이라는 설정을 통해 spring.di.ui라는 패키지에서 한번 component가 있는지 쭉 스캔해주라는 의미로 추가함

image

스캔 뒤에 있으면 객체화 시켜주게 됨

이 과정에서 annotation-config는 객체가 생성되고 그 안을 들여다 보라는 의미인데 scan 과정에서 안을 들여다보므로 필요 없어지게 됨

image

아래와 같이 주석처리를 하여 xml에서는 더 이상 객체를 생성하는 부분이 없게 만듦

image

앞서 예상했듯 @Component라는 Annotation은 지시서에서는 인식하지 못하므로 에러가 뜸

console이라는 이름을 아는 것은 Program.java 파일에서 console이라는 이름으로 객체를 가져오려고 하기 때문임

image

패키지는 spring.di.ui이므로 이 안을 뒤져봐라 하는 의미로 xml에 추가함

image

image

그래도 에러가 나게 되나 이번엔 에러 메시지가 다름

console이라는 이름 자체도 없어졌으므로 이름으로는 찾을 수 없음

따라서 ExamConsole이라는 인터페이스 형식에 맞게 찾게 하는 방법을 통해 실행되게 할 수 있음

image

다음과 같이 어노테이션을 통해서도 이름을 줄 수 있음

xml의 id 대신 @Component의 옵션으로 주는 것임

image

정상 작동됨

image

위에서는 Autowired가 되지 않았으므로 이를 되게 하기 위해선 exam2로 지정해줬던 Qualifier를 지우고 component-scan에 패키지를 추가함

image

image   생성될 NewlecExam 객체에도 @Component 어노테이션을 설정해줌

image

그래도 같은 결과가 나오는데 이는 binding이 되지 않아 exam이 null이여서 나오는 게 아니라 위에서 볼 수 있듯 NewlecExam객체 생성자에서 아무런 작업을 안했기 때문임

확인하는 방법은 Autowired에서 required를 빼고 entity 패키지의 범주를 빼면 에러가 나는데 범주에 넣어주게 되면 정상 출력됨

image

이렇게 xml에서 객체 생성하는 것까지도 어노테이션을 통해 할 수 있다

참고 영상
Watch the video