• 스프링 퀵 스타트 1일차

    2017. 9. 27. 18:12

    by. 위지원

    스프링 퀵 스타트 -채규태 지음 을 보고 공부한내용


    인터넷 여기저길 뒤져서 하다보니 햇갈려서 그냥 책 한권을 빌려왔다. 다시 공부해보자 하루 7시간만 투자하면 5일이면 된덴다 첫째날을 시작해보자 스따또..




    개발환경 구축하기


    1. 프로젝트 생성하기




    2.프로젝트 설정하기





    아래 형광팬으로 색칠한 파일들 삭제 (아마 삭제하는 이유는 하나씩 가르쳐주면서 진행할려고 하시나보다)



    아래 스크롤한 부분 전체 삭제




    마지막으로 pom.xml의 버전 최신화





    프레임워크란 무엇인가


    프레임워크는 쉽게말해 프로그램의 기본뼈대고 개발자는 뼈대에 살 붙이는 작업을 하면된다.


    스프링 프레임워크

    -POJO(Plain Old Java Object)[각주:1]사용하면서도 EJB(Enterprise Java Beans)[각주:2]에서만 가능한 일을 지원하는데 EJB보다 간단함 왜냐하면 스프링이 이미 많은 디자인패턴이 적용되어서 배포 되기때문


    -IOC(Inversion of Control) 은 제어의 역행이라고 하는데 객체간의 느슨한 결합을 유지함

    -IOC가 적용되지 않으면 객체사이의 의존관계를 개발자가 직접했어야하는데 적용되면 컨테이너가 대신처리함

    -컨테이너는 특정 객체의 생성,관리를 담당해 객체운용에 필요한 다양한 기능을 제공함

    ex.servlet 컨테이너 ,ejb 컨테이너 ,스프링도 일종의 컨테이너

    -AOP(Aspec Oriented Programming)은 관점지향 프로그램이라고 해서 로직과 각 비즈니스 메소드마다 반복해서 등장하는 공통 로직을 분리해서 응집도를 높힘



    컨테이너


    스프링프레임 워크를 이해하는데 가장 중요한 개념이 바로 컨테이너


    예를들어서



    이렇게 서블릿을 하나 만들었다고 치면 web.xml에 이렇게 매핑이 등록된다.

    이게 의미가 몬고 하니 /test로 사용자가  url을 치면 위 서블릿 네임에서 test를 찾고 그 테스트에 해아하는 class를 찾아서 doGet() method를 호출하고 doGet()이 한짓을 클라이언트 브라우저에 전송해서 보여주는것임 예전에 한번 공부한 적 있다. [링크]





    결합도


    결합도는 한 클래스의 다른 클래스가 얼마나 많이 연결되어 있는지를 나타내는 표현으로 결합도가 높으면 유지보수가 힘들다


    예를들어


    class A티비{


    티비킨다()

    티비끈다()


    }

     

    class B티비{


    티비전원킨다()

    티비전원끈다()


    }



    이렇게 두개의 클래스가 있다고 가정할때에 A티비 클래스로 구현된 다른 클래스는


    A=new A티비()


    A.티비킨다()

    A.티비끈다()


    이렇게 사용하였을 것이다. 근데 이러다가 B티비 쓸래 해가지고 B로 바꾸면 무슨일이 일어나냐면


    B=new B티비()


    B.티비전원킨다()

    B.티비전원끈다()


    이렇게 메서드를 다바꿔야한다... 이 얼마나 무시무시한 일인가? 이건 단 두줄이니까 그렇지만... 코드가 천줄이 넘어간다고 생각하면 정말 자살하고싶어질것이다.

    그래서 이것을 미리 방지하고자 하는게 다형성을 쓰거나 디자인 패턴을 이용하는것이다.


    다형성은 부모 인터페이스를 하나 설정해놓고 그거 내리받아서 오버라이딩해주는것이고..

    디자인패턴은 전에 패턴에 대해 공부했다 [링크]


    여기에서는 Faxtory패턴에 대해서 말하고 있다.팩토리 패턴 이름귀엽다 팩토리~ 아무튼 ...

    팩토리 패턴은 클라이언트에서 사용할 객체 생성을 캡슐화하여 느슨한 결합상태를 만들게 해주는것이다.


    자 예를들어보자 아래처럼 객체 생성할때 A티비인지 B티비인지 알려줘야했다.이부분을 이렇게 하지말고

    A,B를 파라미터로 넘기는것이다.



    A=new A티비()


    A.티비킨다()

    A.티비끈다()

     

    B=new B티비()


    B.티비전원킨다()

    B.티비전원끈다()



    class BeanFactory{

    public Objext getBean(String TvName){

    if(TvName == A){

     return new A티비();

    else{

    return new B티비();

    }

    }


    이렇게 빈팩토리 클래스를 생성해서


    BeanFactory factory=new BeanFactory();

    TV tv=(Tv)factory.getBean(A나 B);


    tv.티비킨다()

    tv.티비끈다()


    이렇게 넘겨서 객체를 생성하는 것이다. 오 뭔가 이전보다 있어보이는 코드다.



    스프링 컨테이너,설정파일


    web.xml 파일은 컨테이너에서 관리할 객체들을 위한 별도의 설정파일이다.


    src/main/resources누르고 ctrl+N누르면 해당 위자드가 뜨는데 여기서 콘피그 파일눌러서 생성하자




    여기서 이런식으로 등록해서 bean을 관리할 수 있다.


    이렇게 해서



    해당 xml을 로딩해서 컨테이너를 구동시켜 xml에 있는 경로의 클래스를 참조하여 사용할 것이다.

    **class 경로가 A티비면 A티비로 객체가 생성되고 B티비면 B티비로 객체가 생성되는것이다. 


    BeanFactory factory=new BeanFactory();

    TV tv=(Tv)factory.getBean(A나 B);


    tv.티비킨다()

    tv.티비끈다()


    이부분에서 factory를  BeanFactory 대신 xml파일로 생성한다고 생각하묜 됨


    여기서 applicationcontext에는 두가지가 있는데 위에서 사용한 generic은 파일 시스템, 클래스 경로에 있는 xml설정 파일을 로딩하여 구동하는 컨테이너

    그리고 xmlWebApplicationContext 가 있다. xmlapplication은 웹 어플리케이션에서 사용된다. 나중에 mvc구조 볼때 다시 한번 본다.



    스프링 XML설정파일에 대하여


    1.<beans 루트 엘리먼트>

    아래 사진에서 beans 태그로 스프링 프로젝트 전체에서 가장 중요한 역할을 하고 잇다고 한다.

    xml설정파일을 참조하여 <bean>태그의 생명주기를 관리한다.



    2.<import  엘리먼트>

    아래사진에서 import태그로 다른 설정파일을 포함시켜 한 파일에서 작성한것과 같은 기분을 낼 수 있다.



    3.<bean 엘리먼트>

    아래사진에서 클래스 경로를 등록해서 클래스를 등록해 사용할 수 있다. sts의 자동완성기능 (ctrl+spacebar)로 클래스 경로를 찾아서 등록해주면 편리하고 정확하다 (오잇 난 우분투인데 나는 alt+/로 등록되어있다 **)



    **key 확인 방법은 이클립스 상단에 검색창에다가 key검색하면 Menu에 있는  key 에 관한 것을 보여준다 거기서 Content Assist부분을 보면 된다




    bean의 옵션들



    사진에서 보는바와 같이 id도 설정해줄 수 있고 초기화,삭제 메서드도 직접 등록해서 사용할 수 있다.

    lazy-init은 뭐나면 이 bean을 해당 빈이 사용되는 시점에 객체를 생성하도록 하는것이다.

    (원래는 컨테이너를 구동하면 그냥 로딩해버린다 오호 메모리 낭비 --!)



    예를들어서 a=new Z()이라는 변수가 있다고하자

    근데 b=new Z() c=new Z() 이렇게 모든 변수들이 1이라는 하나의 값을 참조하고있다. 그럼 객체가 3개나 생기는거다. 이걸 방지하려면

    a객체 하나 생성해서 b=a c=a 이런식으로 참조해서 쓰면 된다. 이걸 스프링에서는 옵션으로 주고 쓰면 된다. 아래 scope가 바로 그 옵션이다.



    다른 클래스를 참조


    참조하는 방법은 constructor-arg라는 태그로 다른 클래스의 id를 명시해주면 된다.



    파라미터의 전달


    value 태그로 파라미터를 넘길 수 도있으며 index로 몇번째 변수인지도 지정해줄 수 있다.




    setter에 값 주기


    setter인잭션에 대해서 아래와 같이 <property> 태그로 값을 지정할 수 있다.

    여기서 name="" 안에 들어갈 값은 setName,set000 이렇게 000값이다.





    <p>태그를 쓰면 좀더 효율적으로 사용할 수있다고 한다.


    상단에 스키마 로케이션을 추가해준다.


    xmlns:p="http://www.springframework.org/schema/p"


    이걸 추가해주면 무엇이 바뀌냐면


    ref 대신 p:변수명-ref="참조값"

    value 대신 p:변수명="값"


    이렇게 바뀐다.


    이렇게 길었던 코드를 아래와같이 한줄에 할 수 있다는 것이다. 이얼마나 간편하고 놀라운가?







    어노테이션


    근데 생각해보자 위에서 저렇게 bean을 설정하고 어쩌구 이게 수백개의 클래스가 생기면 어떻게 감당할것인가..? xml파일이 몇 천줄이될것..


    상단에 스키마 로케이션을 추가해준다.


    xmlns:context="http://www.springframework.org/schema/context"


    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.2.xsd




    컴포넌트 등록


    이 컨텍스트 태그를 이용하여서 베이스 패키지를 지정해주면 해당패키지에 있는 클래스들을 읽어서 @componet라고 어노테이션이 설정된 애들을 모두  bean으로 등록해준다. @Component("이름") 으로 이름을 등록해줄 수 있는데 이는 xml파일에서  id에 해당되는 값이다.





    의존성주입

    어노테이션의 종류에는


    @Autowired : 변수위에 주로 설정해서 해당 타입의 객체를 찾아 자동할당

    @Qualitier : 특정 객체이름을 이용하여 의존성 주입

    @Inject : Autowired와 동일한 기능

    @Resource : Autowired와 Qualifier 두가지를 결합한 기능


    이렇게 4가지가 있다.



    @Autowired는 해당 객체를 '타입'기준으로 찾아 자동으로 등록해주는것이다. 아래 예제에서 보면  testInterface를 찾을것이다.

    @Qualifier는  만약에 아래사진에서 testson1,testson2모두가 testInterface를 구현한 객체라 하였을때 어떤 객체를 가지고 생성을 해야할지 햇갈리는 경우가 있을것이다. 이럴때 명시를 해주는것이다.





    @Resource는 '타입'기준으로 객체를 검색하는게 아니라 '이름'기준으로 객체를 검색하는것이다.

    @Resource(name="객체이름")으로 사용하면 된다.


    이걸 xml파일로도 설정할 수 있다. 어떻게 하느냐? 하면 일단 아래에서 선언해줬던 컴포넌트 어노테이션들을 모두 제거해준다. (5번라인제거)



    그리고나서 Qualifier도 제거해준다. (13번 라인제거)



    그리고나서 xml파일에다가 한가지 클래스만 등록해주면 끝!





    추가 어노테이션에는


    @Service : 비즈니스 로직 처리

    @Repository : 데이터베이스 연동처리

    @Controller : 사용자 요청제어


    3가지가 있다. 왜있느냐? 위에서 우리는 @Component 어노테이션으로 클래스를 설정했는데 클래스가 많아지면 이 클래스는 머하는 친구지?를 알 수 없다.

    그래서 그 클래스에게 역할을 지정해주는것이다.


    [전체시스템 로직]

    1. pojo가 아닌것은 대표적으로 서블릿이 있음 내가 맘대로 못만들고 규칙에 따라야함 [본문으로]
    2. 스펙이 너무 복잡하고 어렵사리 구현되었다해도 배치,실행을 위해 WAS(Web application Server) 가 또 필요했음 결론적으로 EJB는 시간,노력,복잡성의 단점이있음 [본문으로]

    '2017년 > Spring' 카테고리의 다른 글

    JPA 입문  (0) 2017.10.16
    스프링 퀵 스타트 2일차  (0) 2017.10.11
    tiles를 알아보자  (0) 2017.09.22
    spring xml파일 설정  (2) 2017.09.21
    spring으로 화면에 HelloWorld를 띄어보자  (0) 2017.09.21

    대화의 장 💬