어제 커뮤니티에서 글을 보다가 어떤분이 본인 포트폴리오를 평가해달라며 올린 글을 보게 되었다.

그 글에는 수많은 고수들의 댓글이 달려있었는데, 대부분이 단기간이고 비전공자인데 이정도 수준이면 대단하다.. 뭐 이런 이야기였던것 같다. 물론 그중에는 혼자 한것이 맞냐 이런 의심을 품고 이것저것 물어보는 사람도 있었다.

그 댓글들을 보다가 의문이 들었다.

 

 

댓글 : 왜 @Inject를 쓰셨어요?? @Autowired와 @Inject의 차이는 알고 쓰신건가요?

작성자 : @Inject를 쓰는게 더 좋다는 글을 어디선가 봐서요..

 

 

곰곰히 생각해보니까 둘이 하는 역할은 비슷한것 같은데 어떤 차이점이 있고 어떤 어노테이션을 쓰는것이 좋은걸까 하는 생각이 들었다. 추가로 @Resource도 생각해보게 되었다.

 

 

 

@Autowired

type기반으로 DI를 해주는 어노테이션. 오토와이어드는 스프링 프레임워크에서 제공하는 어노테이션이다. 혹시나 프레임워크를 바꾸어 작업할 일이 생기면 사용할 수 없다. 빈생성시 싱글톤으로 생성하는 것이 디폴트값이기 때문에 같은타입으로 여러개 빈을 만들때 적합하지 않다. @Qualifier("이름")을 사용하면 이름을 찾아서 주입해줄 수 있긴 하다.

 

 

@Resource

name기반으로 DI를 해주는 어노테이션. 리소스는 자바에서 제공하는 어노테이션(JSR-250)이다. 이름으로 주입을 해주기 때문에 같은 타입의 빈을 여러개 만들때 유리하다.

 

 

@Inject

type기반으로 DI를 해주는 어노테이션. 인젝트는 자바에서 제공하는 어노테이션(JSR-330)이다. 타입기반으로 주입을 해준다.

 

 

 

 

@Autowired는 스프링 프레임워크에서 제공하기 때문에 아무래도 프레임워크에 종속적인 성격이 있을 것이다.

@Inject는 자바에서 제공하는 어노테이션이기 때문에 프레임워크에 상관없이 사용할 수 있다. 오토와이어드가 의존성을 확실하게 보장해주기 때문에 더 유리하다는 글도 꽤 있었는데 상황에 맞게 사용하는게 좋은것 같다. 

'이런저런 생각' 카테고리의 다른 글

MVC에서 Interface의 사용이유  (0) 2020.05.15

여러가지 예제도 보고 책도 보고 강의도 보고 게시판 프로젝트를 만들다가 어느순간보니까 아무생각 없이 DAO와 Service에는 Interface를 만들고 구현 클래스를 만들고 있었다...

 

게시판 기능을 추가하다가 문득 내가 왜 Interface를 쓰는거지 하는 생각을 해보게 되었다.

 

Interface는 구현체에 대한 권한을 구현클래스에게 넘겨서 클래스 사이에 의존성을 줄이기 위함이라고 사전적으로는 알고 있었다. 예를 들어서 Interface한개가 있고 여러개의 기능을 하는 구현체가 있다면 다형성 측면에서 이득을 가져갈 수 있는 프로그램이 될 것이다.

 

그런데 내가 만들고 있는 토이프로젝트의 수준에서 봤을 때 Interface가 굳이 필요없다고 판단이 되었다.

 

Interface한개에 딱 한개의 구현체만이 존재하는데 굳이 필요가 있냐하는 의문이 들었던 것이다.

 

 

DAO는 정말 단순하게 Mapper클래스의 객체를 주입받아서 쿼리문이 있는 메소드를 불러오는 것만 구현이 되어 있어서 Interface를 삭제하였다. Service 같은 경우에도 단순하게 게시판이나 유저를 추가 삭제하는 역할만 하기 때문에 분리를 시킬 필요가 없을 것 같았다. 

 

 

 

삭----제

 

 

 

 

클래스를 잘게 분리하고 각 클래스에 맞는 역할을 잘 구분하는 것이 객체지향 프로그래밍에서 중요하다는 생각을 할 수 있게 해주었다... 

 

'스프링 입문을 위한 자바 객체 지향의 원리와 이해' 라는 책을 어제 구매해서 읽었는데 열심히 읽으면서 공부해야겠다고 생각했다..

'이런저런 생각' 카테고리의 다른 글

@Autowired와 @Inject의 차이?  (0) 2020.05.16

+ Recent posts