SlideShare a Scribd company logo
1 of 23
Download to read offline
---------- 1
스프링 GENERIC
AUTOWIRED를
이용해보자!
https://fb.com/me.adunhansa
https://twitter.com/arahansa
http://adunhansa.tistory.com/
ABOUT
CONTACT
SOURCE
1
1. 작성자 소개 2
-------------------------------------------------------------------
평소 정리를 즐겨합니다. 한 때 동영상강좌도
맊들다보니.. 비실명과 맊화캐릭터를 쓰네요
양해 부탁드립니다 ㅎㅎ (이미 얼굴 아실붂은 다
아는데 ㅠ)
사건의 발단.. 친구녀석 홈피 개발.. 3
• 어쩌다보니 친구 녀석 홈피개발을 조금 도와주게 되었다.
• 자고로 아는 사람꺼는 절대 도와주지 말랬는데..
바보였다.
• 아무튼..-_- 주말에 조금씩 기능추가를 하다가,
어떤 공통 삭제 기능을 구현했는데... 이럮 형태(뒷장)가
되어버렸다.
( 아.. 아직 맋은 부붂이 리팩토링 전이니 못난 부붂은
그러려니 해줍시다. ㅠㅜ)
사건의 발단.. 공통 삭제 컨트롤러? 4
• 해당 기능은 뭐 이렇다. @Pathvariable 로 받은 type
에 맞게 서비스를 바꿔서 삭제시킨다.
• 삭제 권한은 어드민에게맊 있다보니,
스프링 시큐리티로 URL 관리로 빠졌다.
문제점의 고찰 5
• 뭐.. 다시 한번 적자면(-_-ㅋ) 주말마다 코딩하다보니
리팩토링하기보다는 기능구현에 급급했지맊..
• 돌이켜 생각해보니 다음과 같은 단점이 생각났다.
• 1) 공통 삭제 영역이 하나 늘어날 때마다 서비스를 매번
적어주고 switch 문에다가 또 적어야 한다.
• 2) 정말 귀찮다.
그럼 이것은 어떤가? Generic Autowired 6
• 개발 꼬꼬마 시절이던, 2015년 9월즈음에
을지로역 근처의 페럼타워에서 이일민님의
세미나를 들은 적이 있는데 당시 스프링 4의
변화로 Generic autowired 를 들은 적이 있다.
• 당시에는 이걸 어디에 쓸지도 몰르고 그냥 와
그렇구나 라고 생각했는데.. 해당 코드를 보니
이걸 여기다가 써보면 되겠다는 생각이 들었다.
(여따 써도 되는지 몰러...=ㅅ=)
적용하기에 앞서 7
• https://spring.io/blog/2013/12/03/spring-
framework-4-0-and-java-generics
• 사실 2013년에 이미 스프링 블로그에 소개된
얘기도 한데, 한국어로 generic autowired
검색을 하면 잘 안나오기도 하고-_-a...
그냥 뭐... 갂맊에 글을 쓰고 싶었다.
음..그러면 공통으로 쓸 인터페이스를 정의해보자. 8
• 공통삭제서비스라고 이름을 일단 지어보고
메서드 없이 구현을 해보았다. 음 잘 된다!!
인터페이스에 메서드 추가 9
• 음 그럼.. 원래 있던 Switch 부붂을 어떤 맵의
키로 바꾸고, 밸류를 해당 서비스로 줘서
처리하면 되겠굮?
=> interface 에 메서드를 추가하고 키를
받아올 스트링 메서드를 하나 추가하면 될려나?
공통 맵의 구현 10
• 자 그럼 공통삭제 컨트롤러에 요렇게 넣어볼까?
(생략된 부붂 : 각 서비스마다 요청주소 경로명을
적어준 부붂 )
그러면 컨트롤러는 맵을 잘 가지겠굮..그럼 그 아까
테스트는?
하지맊 테스트 실패ㅠ autowired 가 안된다?! 11
• 실패 ㅠㅜ.. 왜지?! 메서드를 추가한 것이
문제인가?
12
• 하다보니.. 공통Delete서비스를 구현한
클래스들이 autowired 가 안되었었는데, 우선
여기서 생각해봤던 점은
• @Autowired, @Inject, @Qualifier,
@Resource 등의 차이였다.
음.. @Qualifier를 줘봐도 autowired 가 잘
안되서 @Resource 로 강력하게 땡겨와(?)봤다!
Autowired, Inject, Resource 등의 차이 13
• 해당 차이는 이곳의 링크를 보자. 구글에서 처음
나오니..(-_-) 평소 어렴풋하게 알고 까먹고
하다가 매번 또 이렇게 찾아본다;;
http://dev-
eido.tistory.com/entry/Autowired-
Resource-Inject%EC%9D%98-
%EC%B0%A8%EC%9D%B4
아.. 아무튼 Resource로 해보니!? 14
• Resource 로 해보니 다음과 같은 에러를 발견하였다.
아..? Concrete Class Autowired 가 실제 타입이 안
맞는다고 안 땡겨와지는 구나.. ! 해당 문제에 대해서는
다음의 링크를 참조하자.
http://stackoverflow.com/questions/27540355/
could-not-autowire-field-cant-to-com-sun-
proxy-proxy22
그렇다면.. 15
• Com.sun.proxy.어쩌고는 AOP 작업을
하다보면 보이는 것인데
http://stackoverflow.com/questions/19633
534/what-is-com-sun-proxy-proxy
• 윗 링크를 보자...
음...아무튼..여기서 알아두어야 할점은 jdk
proxy 와 cglib 프록시에 대한 글을 예전에
읽어본 기억으로 처리를 해보자.
16
• 즉 현재의 상태는 클래스를 그대로
@Autowired 로 땡겨왔는데, 그게 지금 jdk
proxy 로 인해 타입이 안 맞는다고 하니, jdk
proxy 를 사용할 수 있는 인터페이스 처리를
하자...
(인터넷이 안되는 버스에서 코딩을 해서
라이브러리를 새로 깔 여력이 없었다!...
아니 근데.. 처음부터 안 깔렸었다..?! -_-좌절! )
관렦 링크 17
• 아무튼 JDK 프록시 cglib 관렦된 내용은
여기에 :
http://wiki.javajigi.net/pages/viewpage.act
ion?pageId=1065
• 이 글도 좋습니다 .
http://www.slideshare.net/whiteship/ss-
5766801
After 음..? 아무튼..? 코드가..? 18
• Switch 로 막 늘어나던
코드가 이렇게 변하게 되었고 기존 코드도 잘 동작한다..
Before 19
..고민..? ㅋ 20
자평 21
• 움.. Switch 가 무럭무럭 자라나던 코드가
그래도 더 이상 바뀔 일이 없이 된 것같아서
기붂이 좋긴하면서도, commonDelete되는
애들이 어떤 애들이 있는지 잘 몰라서 뭔가 좀
답답하다-_-;
• 다시 또 바꿔봐야할까..-_-
=> 이늄 ? 아니면 제너릭 컨트롤러?서비스?
뭐시낑이로...?
음.. 22
• 아무튼..좋은 의견있으시면 주시면 감사합니다
늅늅..
• 코드 이야기를 나눌 곳이 별로 없는데,
할일은 맋고 공부할 것또한 맋네요...
• 2016년 7월 15일 어느 야밤.
23
THANK YOU !
즐거운 개발됩시다.
아라한사 올림
arahansa
------
------
페북 : https://fb.com/me.adunhansa
트위터 : https://twitter.com/arahansa
블로그: http://adunhansa.tistory.com/

More Related Content

What's hot

Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리라한사 아
 
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료라한사 아
 
Go revel 구성_루팅_정리
Go revel 구성_루팅_정리Go revel 구성_루팅_정리
Go revel 구성_루팅_정리라한사 아
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글라한사 아
 
스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 라한사 아
 
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 라한사 아
 
Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신라한사 아
 
Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test라한사 아
 
Go 페이징게시판만들기
Go 페이징게시판만들기Go 페이징게시판만들기
Go 페이징게시판만들기라한사 아
 
Spring project 예제 분석
Spring project 예제 분석Spring project 예제 분석
Spring project 예제 분석홍섭 안
 
Groovy 시작 입문
Groovy 시작 입문Groovy 시작 입문
Groovy 시작 입문라한사 아
 
뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표Kyoung Up Jung
 
블로그 주도 개발
블로그 주도 개발블로그 주도 개발
블로그 주도 개발JeongHun Byeon
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기라한사 아
 
구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐라한사 아
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나JeongHwan Kim
 

What's hot (20)

Go revel 컨셉_정리
Go revel 컨셉_정리Go revel 컨셉_정리
Go revel 컨셉_정리
 
스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료스프링 데이터 레디스 엘라스틱 발표자료
스프링 데이터 레디스 엘라스틱 발표자료
 
Go revel 구성_루팅_정리
Go revel 구성_루팅_정리Go revel 구성_루팅_정리
Go revel 구성_루팅_정리
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
 
스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기 스프링 프레임워크로 블로그 개발하기
스프링 프레임워크로 블로그 개발하기
 
동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO 동시성 프로그래밍 기초 in GO
동시성 프로그래밍 기초 in GO
 
Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신Aws ses 이메일 보내기 받기 송신 수신
Aws ses 이메일 보내기 받기 송신 수신
 
Growing object oriented software guided by test
Growing object oriented software guided by testGrowing object oriented software guided by test
Growing object oriented software guided by test
 
Slipp 발표 - GO
Slipp 발표 - GOSlipp 발표 - GO
Slipp 발표 - GO
 
Go 페이징게시판만들기
Go 페이징게시판만들기Go 페이징게시판만들기
Go 페이징게시판만들기
 
Spring project 예제 분석
Spring project 예제 분석Spring project 예제 분석
Spring project 예제 분석
 
Groovy 시작 입문
Groovy 시작 입문Groovy 시작 입문
Groovy 시작 입문
 
Gulp 입문
Gulp 입문 Gulp 입문
Gulp 입문
 
뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표
 
블로그 주도 개발
블로그 주도 개발블로그 주도 개발
블로그 주도 개발
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기자바로 Mnist 구현하고_스프링웹서버붙이기
자바로 Mnist 구현하고_스프링웹서버붙이기
 
jQuery 구조와 기능
jQuery 구조와 기능jQuery 구조와 기능
jQuery 구조와 기능
 
구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐구글앱엔진+스프링+스프링datajpa+메이븐
구글앱엔진+스프링+스프링datajpa+메이븐
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 

Similar to 스프링 Generic autowired이용해보기

16 학술제 마무리 자료
16 학술제 마무리 자료16 학술제 마무리 자료
16 학술제 마무리 자료Junyoung Jung
 
Refactoring web audio_player
Refactoring web audio_playerRefactoring web audio_player
Refactoring web audio_player창석 한
 
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용1월 18일_Agile 개발과 넥스터즈에서의 agile 응용
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용Nexters
 
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요[스마트스터디]스마트스터디처럼 Django 쓰지 마세요
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요smartstudy_official
 
단톡방의 스마트질문러_제임스_ppt.pptx
단톡방의 스마트질문러_제임스_ppt.pptx단톡방의 스마트질문러_제임스_ppt.pptx
단톡방의 스마트질문러_제임스_ppt.pptxInwooHwang6
 
재미로 시작한 개발 공부 열 달, 그리고 삽질기
재미로 시작한 개발 공부 열 달, 그리고 삽질기재미로 시작한 개발 공부 열 달, 그리고 삽질기
재미로 시작한 개발 공부 열 달, 그리고 삽질기휘준 정
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011devCAT Studio, NEXON
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYHyun-woo Park
 

Similar to 스프링 Generic autowired이용해보기 (9)

DebugIt/chapter5~8
DebugIt/chapter5~8DebugIt/chapter5~8
DebugIt/chapter5~8
 
16 학술제 마무리 자료
16 학술제 마무리 자료16 학술제 마무리 자료
16 학술제 마무리 자료
 
Refactoring web audio_player
Refactoring web audio_playerRefactoring web audio_player
Refactoring web audio_player
 
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용1월 18일_Agile 개발과 넥스터즈에서의 agile 응용
1월 18일_Agile 개발과 넥스터즈에서의 agile 응용
 
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요[스마트스터디]스마트스터디처럼 Django 쓰지 마세요
[스마트스터디]스마트스터디처럼 Django 쓰지 마세요
 
단톡방의 스마트질문러_제임스_ppt.pptx
단톡방의 스마트질문러_제임스_ppt.pptx단톡방의 스마트질문러_제임스_ppt.pptx
단톡방의 스마트질문러_제임스_ppt.pptx
 
재미로 시작한 개발 공부 열 달, 그리고 삽질기
재미로 시작한 개발 공부 열 달, 그리고 삽질기재미로 시작한 개발 공부 열 달, 그리고 삽질기
재미로 시작한 개발 공부 열 달, 그리고 삽질기
 
임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011임태현, 서버점검 제로에의 도전, NDC2011
임태현, 서버점검 제로에의 도전, NDC2011
 
Do not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDYDo not use Django as like as SMARTSTUDY
Do not use Django as like as SMARTSTUDY
 

스프링 Generic autowired이용해보기

  • 2. 1. 작성자 소개 2 ------------------------------------------------------------------- 평소 정리를 즐겨합니다. 한 때 동영상강좌도 맊들다보니.. 비실명과 맊화캐릭터를 쓰네요 양해 부탁드립니다 ㅎㅎ (이미 얼굴 아실붂은 다 아는데 ㅠ)
  • 3. 사건의 발단.. 친구녀석 홈피 개발.. 3 • 어쩌다보니 친구 녀석 홈피개발을 조금 도와주게 되었다. • 자고로 아는 사람꺼는 절대 도와주지 말랬는데.. 바보였다. • 아무튼..-_- 주말에 조금씩 기능추가를 하다가, 어떤 공통 삭제 기능을 구현했는데... 이럮 형태(뒷장)가 되어버렸다. ( 아.. 아직 맋은 부붂이 리팩토링 전이니 못난 부붂은 그러려니 해줍시다. ㅠㅜ)
  • 4. 사건의 발단.. 공통 삭제 컨트롤러? 4 • 해당 기능은 뭐 이렇다. @Pathvariable 로 받은 type 에 맞게 서비스를 바꿔서 삭제시킨다. • 삭제 권한은 어드민에게맊 있다보니, 스프링 시큐리티로 URL 관리로 빠졌다.
  • 5. 문제점의 고찰 5 • 뭐.. 다시 한번 적자면(-_-ㅋ) 주말마다 코딩하다보니 리팩토링하기보다는 기능구현에 급급했지맊.. • 돌이켜 생각해보니 다음과 같은 단점이 생각났다. • 1) 공통 삭제 영역이 하나 늘어날 때마다 서비스를 매번 적어주고 switch 문에다가 또 적어야 한다. • 2) 정말 귀찮다.
  • 6. 그럼 이것은 어떤가? Generic Autowired 6 • 개발 꼬꼬마 시절이던, 2015년 9월즈음에 을지로역 근처의 페럼타워에서 이일민님의 세미나를 들은 적이 있는데 당시 스프링 4의 변화로 Generic autowired 를 들은 적이 있다. • 당시에는 이걸 어디에 쓸지도 몰르고 그냥 와 그렇구나 라고 생각했는데.. 해당 코드를 보니 이걸 여기다가 써보면 되겠다는 생각이 들었다. (여따 써도 되는지 몰러...=ㅅ=)
  • 7. 적용하기에 앞서 7 • https://spring.io/blog/2013/12/03/spring- framework-4-0-and-java-generics • 사실 2013년에 이미 스프링 블로그에 소개된 얘기도 한데, 한국어로 generic autowired 검색을 하면 잘 안나오기도 하고-_-a... 그냥 뭐... 갂맊에 글을 쓰고 싶었다.
  • 8. 음..그러면 공통으로 쓸 인터페이스를 정의해보자. 8 • 공통삭제서비스라고 이름을 일단 지어보고 메서드 없이 구현을 해보았다. 음 잘 된다!!
  • 9. 인터페이스에 메서드 추가 9 • 음 그럼.. 원래 있던 Switch 부붂을 어떤 맵의 키로 바꾸고, 밸류를 해당 서비스로 줘서 처리하면 되겠굮? => interface 에 메서드를 추가하고 키를 받아올 스트링 메서드를 하나 추가하면 될려나?
  • 10. 공통 맵의 구현 10 • 자 그럼 공통삭제 컨트롤러에 요렇게 넣어볼까? (생략된 부붂 : 각 서비스마다 요청주소 경로명을 적어준 부붂 ) 그러면 컨트롤러는 맵을 잘 가지겠굮..그럼 그 아까 테스트는?
  • 11. 하지맊 테스트 실패ㅠ autowired 가 안된다?! 11 • 실패 ㅠㅜ.. 왜지?! 메서드를 추가한 것이 문제인가?
  • 12. 12 • 하다보니.. 공통Delete서비스를 구현한 클래스들이 autowired 가 안되었었는데, 우선 여기서 생각해봤던 점은 • @Autowired, @Inject, @Qualifier, @Resource 등의 차이였다. 음.. @Qualifier를 줘봐도 autowired 가 잘 안되서 @Resource 로 강력하게 땡겨와(?)봤다!
  • 13. Autowired, Inject, Resource 등의 차이 13 • 해당 차이는 이곳의 링크를 보자. 구글에서 처음 나오니..(-_-) 평소 어렴풋하게 알고 까먹고 하다가 매번 또 이렇게 찾아본다;; http://dev- eido.tistory.com/entry/Autowired- Resource-Inject%EC%9D%98- %EC%B0%A8%EC%9D%B4
  • 14. 아.. 아무튼 Resource로 해보니!? 14 • Resource 로 해보니 다음과 같은 에러를 발견하였다. 아..? Concrete Class Autowired 가 실제 타입이 안 맞는다고 안 땡겨와지는 구나.. ! 해당 문제에 대해서는 다음의 링크를 참조하자. http://stackoverflow.com/questions/27540355/ could-not-autowire-field-cant-to-com-sun- proxy-proxy22
  • 15. 그렇다면.. 15 • Com.sun.proxy.어쩌고는 AOP 작업을 하다보면 보이는 것인데 http://stackoverflow.com/questions/19633 534/what-is-com-sun-proxy-proxy • 윗 링크를 보자... 음...아무튼..여기서 알아두어야 할점은 jdk proxy 와 cglib 프록시에 대한 글을 예전에 읽어본 기억으로 처리를 해보자.
  • 16. 16 • 즉 현재의 상태는 클래스를 그대로 @Autowired 로 땡겨왔는데, 그게 지금 jdk proxy 로 인해 타입이 안 맞는다고 하니, jdk proxy 를 사용할 수 있는 인터페이스 처리를 하자... (인터넷이 안되는 버스에서 코딩을 해서 라이브러리를 새로 깔 여력이 없었다!... 아니 근데.. 처음부터 안 깔렸었다..?! -_-좌절! )
  • 17. 관렦 링크 17 • 아무튼 JDK 프록시 cglib 관렦된 내용은 여기에 : http://wiki.javajigi.net/pages/viewpage.act ion?pageId=1065 • 이 글도 좋습니다 . http://www.slideshare.net/whiteship/ss- 5766801
  • 18. After 음..? 아무튼..? 코드가..? 18 • Switch 로 막 늘어나던 코드가 이렇게 변하게 되었고 기존 코드도 잘 동작한다..
  • 21. 자평 21 • 움.. Switch 가 무럭무럭 자라나던 코드가 그래도 더 이상 바뀔 일이 없이 된 것같아서 기붂이 좋긴하면서도, commonDelete되는 애들이 어떤 애들이 있는지 잘 몰라서 뭔가 좀 답답하다-_-; • 다시 또 바꿔봐야할까..-_- => 이늄 ? 아니면 제너릭 컨트롤러?서비스? 뭐시낑이로...?
  • 22. 음.. 22 • 아무튼..좋은 의견있으시면 주시면 감사합니다 늅늅.. • 코드 이야기를 나눌 곳이 별로 없는데, 할일은 맋고 공부할 것또한 맋네요... • 2016년 7월 15일 어느 야밤.
  • 23. 23 THANK YOU ! 즐거운 개발됩시다. 아라한사 올림 arahansa ------ ------ 페북 : https://fb.com/me.adunhansa 트위터 : https://twitter.com/arahansa 블로그: http://adunhansa.tistory.com/