[SPRING][스프링]

스프링이란

쩡시기 2018. 5. 15. 20:18

프레임 워크 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조/약속


container 


동적자동화를 한다.


spring 은 (IoC)컨테이너에 넣어서 시작을 한다.


inversion of control (IoC)



저는 Spring을 쓰는 이유의 가장 큰 것은 DI(의존성주입), IoC(제어 역전), Test 때문이라고 생각합니다.
보통 클래스 내부에서 new 로 객체의 인스턴스를 받아서 사용하는 방식은 모듈간의 강한결합을 불러옵니다.
그래서 변경이나 확장 등에서 자유롭지 못하게 됩니다.
하지만 생성자, setter 등으로 외부에서(스프링에 의해 객체의 생명주기가 관리됨:IoC) 생성된 객체의 인스턴스를 받아서 사용만(의존관계에 있는 객체가 외부로 부터 받음:DI)하는 구조로 개발을 해 놓으면 변경이 있을때 해당하는 부분의 클래스만 변경이 가능합니다.
이런 구조를 가능하게 하는 것이 인터페이스를 사용했을때 가능한데요.
Spring을 사용하면 그런 인터페이스를 먼저 만들고, 그에 대한 구현체를 만드는 페턴이 자연스레 됩니다.
그렇게 되면 모듈 단위의 테스트를 하기에도 매우 쉽습니다.
하지만 반대로 생각하면 특정기능을 너무 많은 인터페이스와 구현체로 쪼개는 결과를 불러와서 관리하기 어렵다는 말도 나올 수 있는데요.
단점이 주는 어려움보다 장점이 주는 편리함이 더 크기때문에 Spring은 앞으로도 많은 인기를 얻을 것 같습니다.

1. 그냥 jsp에서 하면되는걸 굳이 xxx.do로 컨트롤러를 커쳐야 하는이유...
컨트롤러 거치든 안거치든 어차피 소스보기로 jsp내용은 똑같이 볼수있는거고...
제가 그래서 보안문제라고 대답했더니 단지 그것뿐이냐고...
저도 모르겠습니다. 왜그래야하나요?

2. 컨트롤러에서 서비스단을 이용해 db에 접근할때
바로 접근하면 되지 한단계를 더거치죠...
서비스쪽에 쿼리가져오는부분 만들면 dao인터페이스에도 등록해줘야됩니다.
왜굳이 두가지를 만들어야 하는지...

3. 왜 get/set메소드가 있는 모델부분을 만드는지....
파라미터 받을때 getrequest나 xxxModel.getName()
이렇게 받는거나
쿼리데이타 받을때도 그냥 list로 받나 model로 받나 거기서 거긴데요..

오래전과 다른방식으로 스프링에서 사용하는 이유가 분명히 있겠죠.
분명 예전보다 편리하게 더좋게 하기위함일것입니다..
이유가 궁금하네요...



1. 보안도 이유가 되지만 JSP->JSP는 모델1 방식이고, DispatcherServlet을 거쳐서 JSP(단지 View 종류가 JSP인 경우)로 되는 것이 모델2 방식입니다.
서블릿에 의해서 흐름의 제어가 가능하기 때문에 JSP 페이이지를 일일이 찾아다니면서 수정할 필요도 없어지고, 비즈니스로직에서 처리한 결과를 다양한 View Layer에서 표현이 가능합니다.
특히 Spring에서 ContentNegotiatingViewResolver를 사용하면 하나의 Controller에서 JSON, XML, HTML 등등의 여러가지 View로 출력할 수 있습니다.


2. Controller에서 바로 DAO로 접근해서 업무를 처리할 수도 있습니다.
하지만 그러면 Controller에 비즈니스 로직이 들어가므로 Layer를 나눠놓은 이유가 희석됩니다.
Controller는 최소한의 로직(Form에서 받은 내용의 검증, 비즈니스 로직 호출, View로 전달)만 넣는 것이 좋습니다.
또한 트렌젝션을 묶을 단위가 Controller가 되면 안되므로 중간에 비즈니스 로직이 있는 Layer를 두어야 합니다.


3. 보통 getter, setter만 있는 클래스를 DTO(Data Transfer Object) 또는 VO(Value Object)라고 하는데 이를 쓰지 말고 Map을 써서 하는 프로젝트도 많이 있습니다.
서로의 장단점이 있는데 DTO의 장점이라고 하면 해당 업무에서 사용될 내용을 명확하게 알 수 있습니다. Map을 쓰면 key 이름을 알아야 내용을 알 수 있겠죠.
반대로 Map을 쓰는 경우 확장성이 좋습니다.
그렇지만 Spring이 버전이 올라가면서 DTO<->XML로 변환하는 마샬러 기능을 쓰거나, @Valid와 JSR-303을 이용하여 값을 검증하는 등의 업무를 수행하기 위해서는 DTO를 써야 합니다.