본문 바로가기
Spring

[Spring] Spring이란? Spring 환경 설정

by 떠농 2025. 9. 1.
반응형

 

Spring은 경량프레임워크 이다.

프레임워크 = 개발 환경을 의미한다.

2차 프로젝트까지는 개발 환경을 한게 없다.

라이브러리 내가 가져다놓고, 인텔리제이에서 maven을 쓰고(인텔리제이에서는 알아서 다 다운로드가 됨)

 

이클립스에서 하려면 라이브러리를 일일이 받아서 설치를 하고 다 추가 해야한다.

 

물론 spring 라이브러리를 받아야하긴 하는데,

라이브러리를 직접 내가 받아오거나, maven으로 할 것인지는 내가 선택하면 된다.

물론 내가 세세한 것까지 다 알고 싶으면 중요한 것은 아니지만 정리하면 된다. 

 

왜 경량프레임워크라고 하는가?

 

java니까 java의 특징적인 부분을 짚을 필요성이 있다.

java는 객체지향언어이다. (처음에 내가 만들 때 class부터 만든다)

class를 잘 만들고, 활용하기 위해 객체지향프로그래밍으로 넘어가게 된다.

--상속, implement(추상화)

 

java는 객체지향언어인데, java를 배웠으면 java에 대해 얘기할 줄 알아야한다.

"상속과 추상화를 이용해서 객체지향 프로그래밍을 하는 언어이다."

 

여기서 중요하다고 생각하는 것

인터페이스 즉 추상화라고 배웠다.

왜 중요한 것인가?

 

제가 교육을 받을 때에 mvc 기반으로 프로젝트를 하는 주제가 주어졌었는데,

그 때 어떠한 그 mvc기반에서는 Controller를 전부 다 만들어야 했다.

그리고 그 Controller안에서 내가 원하는 요청에 의해서 어떤 Action을 구동해야 할 지

선택하는 그런 프로그래밍을 했어야만 했는데,

 

AdminBoardListAction, UserBoardListAction 등.. 

요청이 관리자쪽 공지사항에 관련된 것은 AdminBoardListAction으로,

요청이 유저쪽 공지사항에 관련된 것은 UserBoardListAction으로,

이렇게 구분이 되어야 하는데, 그것을 하나의 객체로 우리가 통칭해야 할 필요성이 있었다.

 

그 때 Action이라는 인터페이스를 구현해서 모든 AdminBoardListAction과 UserBoardListAction 등..들을

하나로 통합시켰다. 

뭐라고? Action으로  여기서 Action이 인터페이스다.

 

이거를 하기 위해 앞전에서 객체지향프로그래밍을 하면서 스레드도 배우고, 네트워크도 배워서 채팅프로그램도 만들고,

그 안에 여러가지 ArrayList도 쓰고, ArrayList도 사실은 List라는 인터페이스를 구현하고 있다.

그래서 생성하고 빼낼 때 List 자료형으로 받을 수 있었다.

 

하나씩 프로젝트를 한 것과 함께 생각을 해보면 도처에 인터페이스들이 많이 들어가있는 것을 알 수 있다.

입출력(InputStream, OutputStream) Byte기반의 Stream들을 많이 활용했었다.

 

Spring을 배우기 위해 이 모든것을 배웠다고 생각하면 된다.

 

기본적으로 우리가 Action을 인터페이스화 시켜놓고 필요한 Action들을 만들었었는데, 필요가 없어졌다.

이미 이제 Spring 이 라이브러리 안에 모두 포함이 되어있기 때문

 

Spring의 종류에는 2가지가 있다.

1. Spring Framework (=Legacy Spring이라고도 함)

2. Spring Boot ( Spring Framework보다 나중에 만들어짐)

 

위 둘은 다르지만 굉장히 흡사하다.

간단히 설명하자면:::

Spring Framework

1. 설정이 복잡하다. 그나마 maven기반으로 하면 좀 나은데 설정을 무조건 해줘야 한다.

2. 무겁다. 상속을 지원한다. 내부적으로 모양새가 다름. 환경설정이 복잡하고 무겁다.

3. 대신 좋은점으로는, 개발자 입장에서 자유도가 높다.

 

SpringBoot

1. 설정이 자동화 되어있다.

2. 자동화가 되어있으므로 빠르게 개발이 가능하다.

3. 톰캣이 내장되어 있다.(1번의 내용과 같은 내용이다. 자동화가 되어있다)

 

--스프링 다운로드 방법

로그인을 하라고 뜨는데, 확인 누르면 다운로드가 되기는 한다.

다운로드 받아보니 크기가 달라 확인해보니 실제로 파일이 들어있지는 않아서

스프링 다운로드 방법만 숙지하면 된다.

 

1) spring.io 사이트 접속 https://github.com/spring-projects/spring-framework
    메뉴들 중 [Projects / Spring Framework] 선택

2) 화면 우측 깃허브 아이콘 선택
   - 화면을 아래로 이동한 후 [Access to Binaries] 항목에 있는 
     [Spring Framework Artifacts] 링크 선택!
   
3) 화면 아래쪽으로 이동하여 [Spring Repositories] 항목에 있는 
    [https://repo.spring.io] 내용을 클릭 또는 복사하여 새로운 탭에서 연다.

4) 화면 왼쪽메뉴들 중에서 [Artifacts]선택! 후
오른쪽 화면에서 URL to file:의 https://repo.spring.io/artifactory/libs-milestone/ 선택한다.

5) 다음의 순서대로 선택하고 들어가자!
  org/  --> springframework/ --> spring/ --> 4.3.0.RC2/
5) 버전은  4.3.0.을 선택한 후
   [spring-framework-4.3.0.RC2-dist.zip]를 선택하여 다운 받은 후
   압축해제 한다.

 

 

 

 


--프로젝트 생성

pom.xml에서 Spring 라이브러리를 불러올거다.

그 전에 헷갈리지 않도록

1. src/main/webapp안에 index.jsp삭제

2. java안에 servlet파일 삭제

 

<환경설정>

webapp에 WEB-INF 에 web.xml에 소스를 추가해야 한다.

https://goldfish2679.tistory.com/60 참고하여

3. web.xml 설정 에 있는 web.xml 소스를 복붙한다.

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 


Listener는 감지자고 무조건 자동으로 구동된다.

보면 Listener가 구동되는 위치가 org.springframwork.web.context.contextLoaderListner인데,

이것은 우리가 만든게 아니고, Spring이 갖고있는 class를 생성해서 구동시키는 것이다.

 

톰캣이 구동될 때(현재 이 프로젝트가 구동이 될 때) contextLoaderListner가 자동으로 구동이 된다.

그 때, contextConfigLocation을 받아서  /WEB-INF/applicationContext.xml를 무조건 읽어들인다.

 

applicationContext.xml를 만들지 않으면 오류가 난다.

 

 

--

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <mvc:annotation-driven/>
    <context:component-scan base-package="controller" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

 

bean: 씨앗, 커피콩 (북미가 추구하는 것: 모든 시작은 씨앗으로부터 시작된다)

bean이라는 것이 java에서 얘기하는 객체를 생성하라는 의미다.

InternalResourceViewResolver객체가 생성이 되어버리고,

변수 prefix에는 /WEB-INF/jsp/문자열을 넣어주고, suffix에는 .jsp 문자열을 넣어준다.

 

InternalResourceViewResolver 객체는 무슨 역할이냐? 무얼 의미하냐?

화면에 보여주는 것(프론트단)은 전부 /WEB-INF/jsp/ 라는 폴더 안에 있다.

화면에 보여주는 파일들의 확장자는 jsp다.

라는 것을 의미한다.

 

여기서

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

 

bean을 만나면 class에 있는 것을 생성하게 된다.

여기서 bean은 Java에서 얘기하는 객체를 생성하라는 의미이다.

이 bean은 누구를 의미하느냐? class에 있는 것을 생성하게 된다.


즉 InternalResourceViewResolver라는 객체를 생성하라는 것이다.

위 객체가 생성이 될 때,
property: 속성(멤버변수). 이름이 prefix, suffix라는 곳에 .jsp를 넣으라는 의미

prefix와 suffix라는 멤버변수는 누구의 멤버변수를 얘기하는 걸까? 
InternalResourceViewResolver라는 객체에 멤버변수 prefix와 suffix 2개가 있는데,
.jsp를 채워 넣으라는 의미이다.

이거는 어디에 있는거냐면 applicationContext.xml에 있는거고,
applicationContext.xml는 web.xml에 listener에 의해 읽혀진다.


listener는 톰캣이 실행될 때 수행된다.
즉 ContextLoaderListener는 톰캣 구동될 때 수행되고, 그 때 applicationContext.xml를 읽어들인다.

한마디로 간단하게 정리하자면,
톰캣 구동될 때 리스너에 의해서 InternalResourceViewResolver 객체가 생성이 된다.

 

--

applicationContext..xml

/WEB-INF/applicationContext.xml 빨간줄이 뜰텐데, 해당 경로에 applicationContext.xml를 만들어준다.

 

 

그리고 아래 소스를 복붙한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <mvc:annotation-driven/>

    <!--패키지명의 경로-->
    <!--두번째 bean은 줄여서 쓴거고 아래 빈에 value는 풀어서 쓴것임. 줄이려면 name옆에 써도 됨-->
    <!--property는 setter를 부른다. property를 setterInjection이라고 부른다. setMsg가 있어야 한다.-->
    <!--DI:의존성 부여(Dependency Injection-->
    <!--bean이 생성된다. msg에 DI연습입니다를 저장해라. 그러면서 vo1이라는 객체가 생성이 된다.-->
    <bean class="ex1.vo.TestVO" id="vo1">
        <property name="msg">
            <value>DI연습입니다.</value>
        </property>
    </bean>

    <!--무조건 기본생성자를 부름-->
    <!--이 객체는 생성될 때 인자를 받아야 되는 상황이라면 constructor-arg를 넣어서 인자를 넣는다-->
    <!--그게 아니라면 세터인젝션으로 하면 된다.-->
    <!--constructor-arg: 생성자 인젝션-->
    <!--property: 세터인젝션-->
    <bean class="ex1.vo.Test2VO" id="vo2">
        <constructor-arg value="연습입니다." />
        <property name="str" value="연습2"/>
        <property name="value" value="100"/>
    </bean>

    <!--Test3VO를 생성하는 빈을 정의하자
        생성될 때 인자로 3개의 값을 저장해야 한다.
        첫번째가 name="홍길동",
        두번째가 age=23
        세번째가 isMember=true
    -->
    <bean class="ex1.vo.Test3VO" id="vo3">
        <constructor-arg value="홍길동"/>
        <constructor-arg value="23"/>
        <constructor-arg value="true"/>
    </bean>


    <!--참조하는 객체 만들기-->
    <!--id값을 reference로 넣으면 된다-->
    <bean class="ex1.vo.Test4VO" id="vo4">
        <property name="t2" ref="vo2"/>
    </bean>




</beans>

 

 

 

자동으로 움직이는 것들

톰캣이 구동될 때 리스너가 움직이고

리스너가 applicationContext.xml 를 로드한다.

그 안에 있는 bean들을 생성한다.

 

그러면 진짜 그렇게 되는지, 생성이 되는지 를 확인하기 위해

class를 하나 만들어서 bean으로 등록을 해보자.

 

java에 우클릭 java Class 하나 만들기.

ex1.vo.testVO

반응형

댓글