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 설치
(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 를 말한다.