깽쟈
491
2015-09-02 12:23:44
9
11944

static 메소드를 사용하는 것과 스프링 빈을 이용하는 것은 차이가 많이 나나요?


사용자가 이미지를 업로드 하면 해당 파일을 서버에 저장하는 UploadThumbnailImageService 클래스를 구현했는데요. 안에는 setThumbnailImage() 메소드가 있습니다. 그리고, controller에서 해당 서비스 클래스의 빈을 autowired하여 처리했습니다.

그런데, 이 서비스 클래스의 메소드를 static으로 해도 전혀 문제가 될 것이 없고, 또 로직이 변경될 일이 얼마나 있을까, 다른 구현체를 만들 일이 얼마나 있을까 싶었습니다.

static으로 구현하면 빈 하나에 대한 메모리도 아끼고, 처리속도도 올릴 수 있지 않을까요? 서비스 클래스를 빈으로 만들어야 한다면 무엇 때문일까요?

스프링 입문 이제 2개월차... 귀엽게 봐주세요. 감사합니다.

0
  • 답변 9

  • 사과
    618
    2015-09-02 13:02:39

    static에는 의존성 주입을 사용할 수 업지용

    보통 DB쪽 객체를 Service에서 가지고 있잖아요?

    static으로 했을때 DB쪽 객체를 어떻게 가져올지도 고민을 해봐야해요.

    만약 의존성이 아무것도 존재하지 않는다, 그러면 static으로 해도 아무 문제 업습니다.

    만약 그렇게 되면 그 클래스를 Service라고 하지 않고 Util성 메소드 집합 클래스라고 부르는게 낫지 않을까요?

  • OKIHOUSE
    356
    2015-09-02 14:06:15

    스프링의 DI 주입 및 IoC 를 알고계신다면 이해가 좀 더 쉽습니다 ^^


    간단하게 설명드리면 


    해당 메소드에서 다른 Class 또는 Method 를 호출한다고 가정을 해볼때


    호출되는 method 가 static이 아니라면 어떻게 호출을 할까요?


    결국 객체를 new 를 사용해서 새로 만든후에 Class.method 로 호출할 수 밖에 없습니다.


    여기서 스프링의 IoC 의 개념이 무너집니다. 


    스프링은 객체를 new 로 만들지 않습니다. 왜냐면 객체의 생성 및 소멸에 대한 권한을 컨테이너에 


    넘겼기 때문입니다~ 


    만약 static 을 사용하시려 한다면 의존되는 객체를 static 또는 new 로 만들어야 합니다.


    그렇게 사용하신다면 굳이 스프링을 사용하실 필요가 없습니다.


    스프링의 핵심기능인 IoC 를 사용하지 않겠다고 하시게 되는것이니까요~ 


    ** static 으로 만들면 heap 이 아닌 class(method) 영역에  상주시키니까 속도나 

    메모리 면에서(접근) 더 빠를수도 있습니다. 그런 경우도 당연히 있지요 


    하지만 static method 안에서 다른 객체를 new 로 생성한다거나 한다면 해당 method 가


    호출될때마다 객체가 새로 생성되며, 그 객체에 대한 생성과 소멸을 직접 관리하셔야 합니다.


    스프링을 이런 객체에 대한 생성과 소멸을 관리해주며,  싱글톤 레지스트리라는 방법을 사용하여


    객체를 Singleton 과 같이 한번만 생성 하기 때문에  오히려 성능이 더 좋을 수 있습니다. 


    어떤쪽을 택하시겠습니까?? 

  • 깽쟈
    491
    2015-09-02 14:58:57

    오늘도 여느 날과 마찬가지로 아무 생각없이 기능을 구현하기 위한 서비스 클래스를 만들고, 서비스 클래스를 DI 하기 위하여 빈을 만들었지요. 그런데 해당 빈은 로직이 변경되었으면 변경되었지, 또 하나의 구현체가 만들어져야 할 이유도 없고, 내부에서 DI 받을 객체들도 없지요.

    그러니 이것을 static으로 만들어도 괜찮을텐데... 가만 생각해보니 나중에 또 뭔 일이 있어서 다른 구현체가 필요할 수도 있는거고 (전혀 짚히는 부분은 없지만...) 싱글톤이니 걍 빈으로 등록해놔도 메모리 부담도 크지 않을테고, IoC 컨테이너가 관리해주니까 속도도 크게 문제 안 될 것 같은데...

    그래도 대충 어디서 읽은 건 있어가지고 static으로 만들 수 있는건 모두 static으로 만드는 것이 좋다는 어떤 글귀가 생각나 질문을 올려봤네요 ㅎㅎ 과연 현업에서는 static은 얼마나 사용하는지...

    유틸성 집합 메소드라고 하기에는 이 클래스는 업로드 처리만 집어넣을 것이라... 음... 그래도 유틸이라고 보는 쪽이 더 좋겠군요.

  • OKIHOUSE
    356
    2015-09-02 15:18:44

    Static 을 사용한 Util 은 많이 사용합니다. 


    단, 절대 변수형태로 저장해서 사용하지 않지요(무결성)


    하나 궁금한것은, 업로드를 어떤 방식으로 하시길래 의존성이 전혀 없을수가 있을까 궁금하네요~


    Local 에 저장하는 방식인가요? 아니라면 FTP? Http 로 파일전송? AWS S3? .. 등등 인가요?



  • 깽쟈
    491
    2015-09-02 15:46:27

    OKIHOUSE

    Local에 저장합니다~

    jsp의 form 데이터를 컨트롤러에서 DTO로 받아와서 서비스 클래스의 메소드에 DTO와 HttpRequest를 인자로 전달해서 처리하는데요. 이 클래스가 특정 기능에 독립적이라 그런 것인지... 딱히 DI 할만한게 없는 것 같습니다. (물론 경험이 부족하여 필요성을 못 느끼고 있기 때문일겁니다)


  • OKIHOUSE
    356
    2015-09-02 16:09:37

    음.... 테스트하시는 중이거나 뭔가 혼자서 공부중이신건가요?


    실제 서버로 설명을 드리자면


    예를들어서 WAS(e.g tomcat, Jboss...etc) 같은 경우는 단독으로 있는 경우는 거의 드뭅니다.


    이유는 해당 WAS 에 문제가 생기는 경우 서비스에 문제가 생기기 때문인데요..


    상당히 치명적이죠~ (예를들어 WAS 가 죽으면 사이트 접속이 안됩니다)


    갑자기 이런얘기를 왜 하냐면 


    보통의 경우 Local 에 이미지나 파일들을 저장하지 않기 때문이에요~


    왜냐면 Tomcat 1번, Tomcat 2번 각각의 서버에 올라가 있는데  파일이 1번서버에 올라간 경우


    2번 톰캣은 그 파일을 못찾을 수도 있으니까요~ 


    결론은, 결국에 업로드 하는 메소드에 무언가 의존성을 맺게 되실거라는 겁니다~


    그게 FTP 접속이 되었든 AWS S3 업로드가 되었든지간에요~~ ^^ 



  • 깽쟈
    491
    2015-09-02 16:21:06

    OKIHOUSE

    네, 맞습니다. 저는 전문 개발자가 아니고, 3D 그래픽스를 업무로 하는 회사원이구요. (뽀롱뽀롱 뽀로로 같은거 만듭니다) 기술쪽 파트에 심취하여 아예 그쪽으로 진로를 변경하고, 그래픽과 프로그래밍을 겸하는 일을 하고 있습니다. 프로그래밍은 독학으로 진행하였고, 멘토도 없고, 그래서 기초가 많이 부실하죠. 위에서 이야기하신 것도 처음 알았네요 ㅎㅎ

    지금 개발중인 것은 프로젝트 관리 시스템인데 맨땅에 헤딩으로 어렵게 어렵게 제작하기 시작하여 이제 곧 오픈을 앞두고 있습니다. 말이 오픈이지 고도화 해야할 것 투성이지요. 인트라넷처럼 폐쇄적인 공간이고, 이 사이트가 잠깐 죽는다고 하더라도 전사적인 업무가 완전 중지될 정도로 지장을 주지는 않습니다. 약간의 불편한 점은 있겠지만요. 그래서 WAS와 DB도 같은 서버에 붙어있고, 파일도 로컬에 저장하도록 했습니다.

    실무에서는 웹서버를 2대 운영하는군요. HA 클러스터링이라고 하나요? 나중에 관련 내용도 공부해야겠네요.

  • OKIHOUSE
    356
    2015-09-02 16:36:11

    개발직이 아니신데도 스프링을 하시는거 보면 이해력이 빠르신 것 같네요 ^^


    실무에서는 웹서버를 2대만 운영하는건 아니구요 ~ N 개라고 표현하는게 맞을 것 같습니다.


    HA 클러스트링까지 들어가게 되시면 아예 개발직군이나 서버사이드 개발자로 가셔도 되겠네요 ^^

  • 깽쟈
    491
    2015-09-02 16:44:04

    OKIHOUSE

    세상이 좋아져 인터넷에 정보가 널려있으니 저도 열심히 ctrl+c, ctrl+v를 하고는 있습니다만 하면 할수록 기초가 중요하다는걸 새삼 느낍니다. 요즘 자바의 정x을 다시 열심히 보고 있어요.

    많은 도움 됐습니다. 감사합니다~

  • 로그인을 하시면 답변을 등록할 수 있습니다.