본문 바로가기

카테고리 없음

[LifeSoft] spring 3강 DB 연결 테스트, Controller와 View의 연결

반응형

Url Pattern

 

tomcat에 내장된 서블릿이 두개가 있다.

  DefaultServlet => 서블릿 클래스 매핑하는 클래스

  JspServlet => *.jsp 페이지 매핑

위치가 어디에 있냐하면

우리가 설치한 톰킷폴더에 가면 (아무대나 설치했음 ^^)

C:\Users\i5\Downloads\apache-tomcat-9.0.14\conf 에 web.xml 에 가면

110 line, 408 line

 

1

2

3

4

5

6

7

<servlet-name>default</servlet-name>

<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>

 

<servlet-mapping>

  <servlet-name>default</servlet-name>

  <url-pattern>/</url-pattern>

</servlet-mapping>

 

 

 

262 line, 414 line

 

1

2

3

4

5

6

7

<servlet-name>jsp</servlet-name>

<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

 

<servlet-mapping>

  <servlet-name>jsp</servlet-name>

  <url-pattern>*.jsp</url-pattern>

</servlet-mapping>

역할이 구분이 되어 있는데

web.xml에 있는 '/'을 '/*'(모든요청을 다받겠다)로 수정하고 다시 실행하면

404에러가 뜬다.

 

'/*'로 선언하면 jsp건 뭐건 다 DispatcherServlet으로 가라는건데

HomeController의 리턴값 return 'home'; 에서

jsp 파일로 못가고 다시 서블릿으로 가다 보니깐 못찾는다는 메시지가 뜬다.

 

그래서 스프링에서 url관련 클래스가 추가되어서 DispatcherServlet이 담당한다.

DispatcherServlet은 servlet-contex.xml을 참조한다.

기본 서블릿(톰킷)을 스프링에서 지원하는 서블릿으로 바꿔버렸다.

 

/ => Default Servlet =>DispatcherServlet

/* => 모든 요청(서블릿+jsp)

*.do => 확장자가 do인 서블릿

 

http://localhost/spring01/board/view/1 (restful한 url)

http://localhost/spring01/board/view.do?idx=1 (이렇게 해도 되는데)

 

 

 

 

HomeController

model은 request에 해당된다고 보면 된다.

 

http://localhost:8080/spring01/ 로 요청을 하면

일단 web.xml에서 보면

root-context.xml (스프링의 환경설정 파일 로딩, 서블릿 이외의 설정-dbcp)과

servlet-context.xml (서블릿 환경설정)을 읽는다.

두개로 나눠서 관리하는게 좋음

 

root-context.xml

db연결관리 설정해 놓았음

 

servlet-context.xml

뷰리졸버로 jsp 주소를 매핑해준다.

 

 

 

 

Controller => Model => View

Controller => Service => Model => View

ex) 하나의 트랜잭션이 여러개의 메서드로 처리된다.

 

마. 스프링의 디렉토리 구조

scr/main/java - 자바 코드(Contoller, Model, Service)

 

scr/main/resources - 자바 코드에서 참조하는 리소스 파일들.

                                sqlMapConfig.xml, mybatis의 mapper

 

src/test/java - 테스트 관련 코드

 

src/test/resources - 테스트 코드에서 참조하는 리소스 파일들.

 

src/main/webapp - 웹 서비스 루트 디렉토리(외부에서 접근 가능)

 

src/main/webapp/resources - js. css, image 등의 웹 리소스 파일

 

src/main/webapp/WEB-INF/classs - 컴파일된 클래스

 

src/main/webapp/WEB-INF/spring - 스프링의 환경설정 파일

  src/main/webapp/WEB-INF/spring/root-context.xml - 서블릿과 관련되지 않은 모든 리소스에 대한 설정

  src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml - 서블릿과 관련된 리소스에 대한 설정

 

src/main/webapp/WEB-INF/views - html, jsp 페이지

 

src/main/webapp/WEB-INF

  외부에서 접근 불가능(보안을 위해서)

  컨트롤러를 경유해서 접근 가능

  http://localhost:8080/spring01/WEB-INF/home.jsp (404 not found)

 

pom.xml - 메이븐에서 참조하는 설정 파일

 

사. maven repository 조회

 

 

2. Spring과 Mybatis의 연동

가. 로깅툴

 

1) 로깅툴을 사용하는 이유

- System.out.println() 명령어는 IO 리소스를 많이 사용하여 시스템이 느려질 수 있음.

- 로그를 파일로 저장하여 분석할 필요가 있음.

 

2) 로깅툴의 종류

- commons-logging: 스프링 3에서 사용하던 로깅툴

- log4j : 효율적인 메모리 관리로 그동안 많이 사용되었음.

- logback : log4j 보다 성능이 더 우수하여 최근 많이 사용함.

  SLF4J : logback을 사용하기 위한 인터페이즈

 

3) SLF4J 설정방법

1. pom.xml의 slf4-version을 1.7.25로 설정

 

1

2

3

<properties>

  <org.slf4j-version>1.7.25</org.slf4j-version>

</properties>

2. pom.xml에 라이브러리 추가

3. src/main/resources 에 logback.xml 파일 작성

sql문장도 로그 저장

 

4. 로그를 수집할 클래스에 변수 선언

private static final Logger logger = LoggerFactory.getLogger(클래스이름.class);

 

private : 외부에서 로그를 가로채지 못하도록 하기 위해서

static final : 로그 내용이 바뀌지 않으므로

 

5. 로그를 수집할 method에서 로그 수집 명령어 호출

logger.info("로그 타이틀", 출력할 값);

 

4) 로그의 level

1. Debug : Debug, Info, Warm, Error 포함

2. Info : Info, Warm, Error 포함

3. Warm : Warm, Error 포함

4. Error : Error 포함

 

 

나. 데이터베이스 연결 설정 및 테스트

 

oracle 설치

https://wikidocs.net/3900

https://m.blog.naver.com/PostView.nhn?blogId=kimkwon429&logNo=220730730691&proxyReferer=https%3A%2F%2Fwww.google.com%2F 

(ex: 설치가 잘 안되어서 다지웠다가 설치를 했는데

시작메뉴에는 안나옴  그래서 폴더에서 실행파일 직접 누름.)

 

1)오라클 테이블 스페이스 생성

cmd에서 작업

관리자 계정으로 접속

sqlplus system/1234

--Oracle 12c 버전의 경우 11G와 호환하기 위해 아래 명령어를 입력

alter session set "_ORACLE_SCRIPT"=true;

--테이블 스페이스 생성

create tablespace spring

datafile 'd:/spring.dbf' size 50m

autoextrend on

next 10m

maxsize unlimited

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

아이디입력: system

비밀번호 입력:

접속됨:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create tablespace spring

  2  datafile 'd:/spring.dbf' size 50m

  3  autoextend on

  4  next 10m

  5  maxsize unlimited;

테이블이 생성되었습니다.

 

 

SQL> create user spring identified by 1234

  2  default tablespace spring;

User가 생성되었습니다.

SQL> grant connect, resource, dba to spring;

권한이 부여되었습니다.

 

oracle 설치 후 클라이언트 설치 (oracle sql developer)

oracle sql developer 다운로드 후 oracle 설치폴더에 덮어씀

sqldeveloper.exe실행

실행(접속이 잘 안되면)

또는 Net Manager를 실행해서 서비스이름지정-서비스 이름 (spring)에 입력된 이름을 쓰면 됨

xe , orcl, spring.. 중에 하나일 듯

https://antworld.tistory.com/27

스프링 계정으로 잘 접속된다.

 

토드 설치

etc) 

oracle sql developer 실행시 자바 패쓰를 넣으라는 메시지 창이 뜨면

C:\Program Files\Java\jdk1.8.0_112 까지만 입력할 것

참고 : https://all-record.tistory.com/76

etc) 

oracle sql developer 접속실패시

Listener refused the connection ORA-12505

참고 : https://hunit.tistory.com/211

 

 

접속이 잘 되면 코드에서 접속이 잘 되는지 확인해 본다.

2) src/test/java/OracleConnectionTest.java

데이터베이스 연결을 테스트하기 위한 테스트 케이스 작성

@Test 코드에서 에러가 발생할 경우 Add Junit 4 library to the build path를 클릭하여 라이브러리를 추가해야 함. (@Test에서 우클릭)

개발이 끝나거나 중간에 병행해서 테스트를 한다. 사람이 하면 시간과 정확도가 떨어지기 때문에 자동화한다.

 

코드를 작성한 후 JUnit Test로 실행

 

테스트시 오라클은 유료이기 때문에 메이븐 저장소에서는 잘 안된다.

외부에서 저장소를 가지고 온다.

pom.xml의 com.oracle.ojdbc6은 메이븐 중앙 저장소에 있는게 아니라

아래에서 가져온다.

 

<repositories>
  <repository>
   <id>codelds</id>
   <url><a href="https://code.lds.org/nexus/content/groups/main-repo"></a>
        <a href="https://code.lds.org/nexus/content/groups/main-repo" target="_blank">
        https://code.lds.org/nexus/content/groups/main-repo</a>
   </url>
  </repository>
</repositories>

 

1

2

3

4

5

6

<repositories>

  <repository>

   <id>codelds</id>

   <url><a href="https://code.lds.org/nexus/content/groups/main-repo"></a><a href="https://code.lds.org/nexus/content/groups/main-repo" target="_blank">https://code.lds.org/nexus/content/groups/main-repo</a></url>

  </repository>

</repositories>

 

DataSource 관련 xml을 Class로 바꿔보면 아래와 같다.

코딩으로 할 것을 xml로 바꾼거다.

<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <!-- 드라이버 클래스 이름이 변경됨 -->
  <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
  <!-- 연결문자열에 log4jdbc가 추가됨 -->
  <property name="url"
   value="jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl" /> <!-- xe -> orcl -->
  <property name="username" value="spring" /><!-- hr -> spring -->
  <property name="password" value="gksmf10" /><!-- hr -> gksmf10 -->
</bean>

 

1

2

3

4

5

6

7

8

9

10

<bean id="dataSource"

  class="org.springframework.jdbc.datasource.DriverManagerDataSource">

  <!-- 드라이버 클래스 이름이 변경됨 -->

  <property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>

  <!-- 연결문자열에 log4jdbc가 추가됨 -->

  <property name="url"

   value="jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl" /> <!-- xe -> orcl -->

  <property name="username" value="spring" /><!-- hr -> spring -->

  <property name="password" value="gksmf10" /><!-- hr -> gksmf10 -->

</bean>

 

class DriverManagerDataSource {

  String driverClassName = "net.sf.log4jdbc.sql.jdbcapi.DriverSpy";

  String url = "jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl";

}

사용을 할때는

DriverManagerDataSource dataSource = new DriverManagerDataSource();

xml의 클래스명(DriverManagerDataSource )과 id(dataSource)명이 일치한다.

xml태그로 만들어 놓으면 서버가 startup되면서 xml의 설정을 스프링이 만들어서 올려준다

 

4) src/test/java/myBatisTest.java

자바 코드에 데이터베이스 연결 문자열 등의 중요한 정보를 직접 입력하는 것은 보안상 안전하지 않음.

 

*mybatis 관련 bean

 

SqlSessionTemplate이 : SqlSession 객체 생성

SqlSessionFactoryBean이 : SqlSessionTemplate 객체 생성

DriverManagerDataSource가 : DB연동 관련 정보를 참조하고 있다. DB연동 클래스

 

sqlSessionFactory bean 설정이 잘 되어 있는지 알아보는 코드를 만들어보자.

SqlSessionFactory 객체 주입

 


classpath: 는 src 를 말한다.