개발일지/Java + Spring

[Spring] 스프링 환경&실행 경로 파악하기

연습용365 2021. 12. 7. 20:45

아직 개념이 잡히지 않았기 때문에 틀린 부분이 많음 . . .

 

WAS가 올라갈 때(실행) 참고 하는 파일 

//////////////////////////////////////////////////////////////////////////////
/////// 호스트 파일 등록
//////////////////////////////////////////////////////////////////////////////

★ C:\Windows\System32\drivers\etc
● hosts
127.0.0.1 hiboard.icia.co.kr 매핑 시킴
- daun.net의 도메인은 어디 있나? 내 PC에 없는 도메인은 밖으로 나가서 찾는다.
- 127.0.0.1을 입력하면 인터넷이 끊겨도 내 PC에 있는 주소인 걸 알아서 뜬다.
- 기본적으로 포트 번호는 80번 우리는 웹서버와 WAS를 같이 사용한다.
  Oracle와 포트 충돌로 인해 8088 포트 번호로 바꿔주었다. 

☆도메인이 정해지면 이 파일에 추가만 하면 됨☆

 


//////////////////////////////////////////////////////////////////////////////
/////// TomCat 환경설정
//////////////////////////////////////////////////////////////////////////////

★ C:\project\tomcat-9.0.55\conf ★ 환경설정 폴더
- 톰캣의 환경설정 파일에 있다는 말은 WAS가 실행 될 때 
  이곳에 있는 파일들을 모두 읽어서 WAS 메모리에 올려둔다.

★ C:\project\tomcat-9.0.55\conf\server.xml
● server.xml
- 69번 : 8088 톰캣의 포트 번호 설정
- 172번 : name="호스트에서 지정한 도메인명", appBase =""
- appBase의 경로가 비어있는 경우 톰캣에서 Catalina 폴더로 이동하도록 설정되어 있다. 
  때문에 지정하는 순간 폴더 안에 \Catalina\도메인명 폴더를 만들고,
  그리고 그 안에 있는 ROOT 파일을 만든다.

  이 파일을 톰캣이 읽도록 되어 있다. 

★ C:\project\tomcat-9.0.55\conf\Catalina\hiboard.icia.co.kr\ROOT.xml
● ROOT.xml
docBase="C:\project\webapps\hiboard\src\main\webapp"
docBase = "기본경로"
http://hiboard.icia.co.kr:8088/를 하게 되면 이쪽으로 이동을 한다.


~이렇게 해서~
WAS가 실행될 때 cof 폴더에 있는 server.xml
Catalina 폴더에 있는 것도 다 가지고 가서 읽고 처리하니까 
hiboard.co.kr:8088  들어오면 ==> docBase = "\src\main\webapp"
자동으로 처리해준다. 

 

 

 

//////////////////////////////////////////////////////////////////////////////
/////// WAS에서의 기본 파일 설정
//////////////////////////////////////////////////////////////////////////////

★ C:\project\tomcat-9.0.55\conf\web.xml
● web.xml
- 도메인에 hiboard.icia.co.kr:8088 검색 했을 때 

  conf 폴더를 모조리 메모리에 올려둔다.

  그 때 같이 올라가는 파일

 

- 최하단 웰컴 파일 설정 
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>


- docBase = "C:\project\webapps\hiboard\src\main\webapp"

- docBase에 의해 폴더 바로 밑에 있는 웰컴 파일을 이것 때문에 읽는 거임!!

 

 


WAS가 올라갈 때(start) 참고 하는 파일 2개


1. tomcat/conf/server.xml  -  포트 번호/호스트 등록 

conf/Catalina/hiboard.co.kr/ROOT.xml - docBase 기본 폴더 경로

(이건 server.xml이 참조함)

2. 같은 폴더에 있는 web.xml 참고

 


//////////////////////////////////////////////////////////////////////////////
/////// Spring 기본 파일 경로
//////////////////////////////////////////////////////////////////////////////

 

★ /src/main/webapp/WEB-INF/web.xml
● web.xml 

- 전체적인 Spring 환경 설정 web.xml

- hiboard.icia.co.kr:8088을 쳤을 때 가리키는 파일은

  webapp가 기본이지만 클래스 파일은 WEB-INF가 기본 폴더이다.
- 그래서 기본 경로 설정 파일(web)이 WEB-INF 밑에 있음

 

 

 

contextConfigLocation 이름으로 로드중이다. 

경로 : /WEB-INF/config/spring/root-context.xml 

- 제일 먼저 올림

- 역할은? env.xml 환경변수 값을 읽어서 

  오라클 접속(히카리)해서 커넥션 맺음

- WAS가 올라갈 때 Spring 환경설정도 같이 해줘야 함
  웹 브라우저에서 주소 엔터칠 때 실행되는 게 아니라 
  WAS가 스타트 하면서 실행되는 파일이다.

 

 


root-context.xml 이동

<!-- 환경변수 시작 -->
<util:properties id="env" location="/WEB-INF/config/env.xml" />
<!-- 환경변수 종료 -->

 

 

시작하자마자 다른 파일을 불렀다.

 

 

env.xml 이동 (DB 접속정보)

<!-- ########## 사이트 타이틀 시작 ########## -->
<entry key="site.title">ICIA-계층형 게시판</entry>
<!-- ########## 사이트 타이틀 종료 ########## -->

<!-- ########## 히카리데이터베이스 연결 설정 시작 ########## -->
<entry key="db.pool.name">icia-hikariCP</entry>
<entry key="db.driver.class.name">oracle.jdbc.OracleDriver</entry>
<entry key="db.jdbc.url">jdbc:oracle:thin:@localhost:1521:xe</entry>
<entry key="db.username">c##iciauser</entry>
<entry key="db.password">1234</entry>
<entry key="db.maximum.pool.size">3</entry>
<entry key="db.minimum.idle">3</entry>
<entry key="db.connection.test.query">SELECT 1 FROM DUAL</entry>
<entry key="db.connection.timeout">3000</entry>
<entry key="db.idle.timeout">600000</entry>
<!-- ########## 데이터베이스 연결 설정 종료 ########## -->

 

- key="변수명" 태그 가운데 값이 변수의 값임

- site.title실제 타이틀 찍을 때 써먹음

- 테스트 쿼리만 날려서 결과를 갖고 오는 게 아니라 성공/실패 여부만 갖고옴 

- db.pool.name : icia-hikariCP

 

 

다시 root-context.xml 이동

<!-- 환경변수 시작 -->
<util:properties id="env" location="/WEB-INF/config/env.xml" />
<!-- 환경변수 종료 -->

<!-- HikariCP configuration 시작 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
    <property name="poolName" value="#{env['db.pool.name']}" /> 
    <property name="driverClassName" value="#{env['db.driver.class.name']}" /> 
    <property name="jdbcUrl" value="#{env['db.jdbc.url']}" /> 
    <property name="username" value="#{env['db.username']}" /> 
    <property name="password" value="#{env['db.password']}" /> 
    <property name="maximumPoolSize" value="#{env['db.maximum.pool.size']}" />
    <property name="minimumIdle" value="#{env['db.minimum.idle']}" />
    <property name="connectionTestQuery" value="#{env['db.connection.test.query']}" />
    <property name="connectionTimeout" value="#{env['db.connection.timeout']}" />
    <property name="idleTimeout" value="#{env['db.idle.timeout']}" />
</bean>
<!-- HikariCP configuration 종료 -->

 

 

- HikariConfig

- 이미 정해져 있는 name을 갖고 옴

- 값을 어떻게 세팅했는지만 봄

- value="#{env['db.pool.name']}" -- env는 윗쪽의 id값 -- 작은따옴표 안쪽은 변수명

- db.pool.name : icia-hikariCP  -- 위에서 갖고 온 풀네임

- 이런식으로 root-context에서 env에 접속을 다 하고

<!-- HikariCP configuration 종료 -->

 

 

root-context.xml

<!-- dataSource 생성 시작 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean>
<!-- dataSource 생성 종료 -->

 

실제 환경변수를 다 하고 root-context를 통해서 DB select로 날려 보는 것임

 

 

- 매핑 시켜줘야한다.

- name="mapperLocations" 위치가 어디?

- value="classpath*:com/icia/web/mapper/**/*.xml" 

- 폴더가 와도 되고 파일이 와도 됨 어떤이름.xml

  그거랑 Dao 인터페이스에 있는 id 값이랑 매핑!!

- 위아래 서로 짝꿍 어떻게 알까? id값과 value값이 같으니까!

  실제로도 무조건 똑같이 맞춰줘야 됨!!!

- 42 id, 51 name, 58 value
UserDao.java / UserDao.xml 이름이 같아야 하는 이유도 여기서 설정을 한 거임!!

 

 

* root-context는 WAS가 시작할 때 적용하는 거임

그런데 여기에 쿼리가 추가(Dao 메소드 추가)가 된다면?

무조건 WAS를 내렸다가 다시 올려야 됨

- 무조건 톰캣부터 읽고 스프링 환경을 읽어 줌

 

 

 

57 : value = "com.icia.web.dao/UserDao.java"

- 인터페이스 : 메소드가 모두 추상메소드이다. 

 

45 : value="classpath*:com/icia/web/mapper/**/*.xml"

- 57&45 서로 짝꿍이어야 됨

 

 

위아래 서로 이어 주는 건 49라인이기도 함... 어렵네 .....

DB접속하고 Dao와 xml을 연결 시켜서 템플릿을 만들어 놓은 건 root-context.xml에서 함

여기서 맞춰준 거임 

 

<context:component-scan base-package="com.icia.web.service" />

오라클 서비스 폴더에 있는 거 다 스캔해주는 거임

@autoWired

 

 

root-centext에서 해주는 거 

Controller -> Service -> Dao & xml

 

로그인창 index.jsp 호출할 때 어떻게 호출?

Controller에서 서비스 호출, Service에서 Dao 호출, 다우&xml (프로그램 기준)

 

그런데 root-context에서는 어디까지 연결 작업을 한다?

root-context.xml이 DB연결은 해놓고, 다우&xml랑 연결해서 템블릿 만들어 놓음

서비스까지 메모리에 올려 놓음 서비스에서 다우 짝꿍 안 맺음 (서비스만)

 


스프링 환경 세팅

 

일단 webapp/WEB-INF/web.xml 메모리에 올려

- root-context.xml - 

env.xml - 환경 변수값

환경 변수값을 읽어서 오라클에 접속 후 커넥션 맺음

접속은 히카리시피 이용해서 커넥션 풀을 맺음

쿼리도 날려 보고 접속 ok 로그에 찍어 줌

 

실행과 환경세팅은 거꾸로

xml&다우 연결 시켜서 템플릿을 만듦

서비스 패키지에 있는 애들도 메모리에 올려뒀음

(여기까지가 root-context.xml)

 


root-context.xml이 끝났다면 다시 web.xml로 돌아간다.

★ /src/main/webapp/WEB-INF/web.xml
● web.xml 

 

 

19 스프링 시작할 때 기본적으로 실행

23 캐릭터 인코딩 필터 : UTF-8 정의임

39 /* 루트 밑에 전부 정의 해둔 거임

 

 

디스패쳐 서블릿을 WAS가 실행될 때 정의한다.

전체적인 환경 설정은 /webapp/WEB-INF/web.xml 이지만 

DispatcherSevlet의 환경 설정은 servlet-context.xml에 정의!!

 

 


 

/webapp/WEB-INF/config/spring/servlet-context.xml 

<!-- 어노테이션 service, controller 스캔 시작 -->
<context:component-scan base-package="com.icia.web.controller" />
<!-- 어노테이션 service, controller 스캔 종료 -->

 

 

- 디스패쳐서블릿에 등록할 컨트롤러를 매핑 시켜둠(올려둠)

- 패키지 경로 com.icia.web.controller

 

<!-- url 매핑 시작 (이미지, 자바스트립트, 스타일시트 디렉토리)-->
<mvc:resources mapping="/resources/**" location="/WEB-INF/views/resources/" />
<!-- url 매핑 종료 -->

 

- 디렉토리는 리소스 안에 어디든

- /WEB-INF/views/resources/ 경로를 바라볼거야 

 

<!-- View Resolver 시작 -->
<!-- 컨트롤러에서 리턴하는 뷰 이름에 접두사, 접미사를 붙여서 JSP페이지의 경로를 찾는다. -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- JSTL 사용 -->
    <property name="prefix" value="/WEB-INF/views" /> <!-- 접두사 -->
    <property name="suffix" value=".jsp" />           <!-- 접미사 -->
    <property name="order" value="1" />               <!-- 순서 -->
</bean>
<!-- View Resolver 종료 -->

 

/인덱스

- Controller 안에 있는 Request를 매칭에서 올라가면서 실행되는 것들

등록되는 것들 스트링 타입이 /인덱스야 

그러면 경로를 가지고 조합해서 스트링에 값을 넣어 놓는다.

 

실행하는 시점에 넣는 게 아니라 WAS에 다 올라가서 스프링 환경 세팅 하면서 이 파일을 읽으며 다 조합한다.

- 그래서 어노테이션이 필요함

- @Request 매핑정보 어노테이션을 통해서 리턴 타입이 정해짐

- 이곳에서 읽어서 스트링이면 매핑 메소드에 정보를 갖고 있음