JDK당 Spring Framework 버전
- JDK 8+ => spring 5.x
- JDK 6+ => spring 4.x
- JDK 5+ => spring 3.x
Missing tools 오류 발생시
- 해당 오류가 발생하 때는 보통 JRE가 PC에 설치된 JRE폴더의 VM을 참조해 발생하는 문제이다.
- PC의 JDK폴더 내부의 JRE VM을 참조하도록 설정을 변경한다면 문제가 해결된다.
home.jsp의 실행 과정
- 가장 먼저 web,xml을 참조하게 된다. (웹 프로젝트의 배치 기술서)
=> 웹 프로젝트의 중요한 정보들을 가지고 있는 환경 설정 파일이라 할 수 있다. - Spring 내에 자체적으로 내장된 DispatcherServlet을 디폴트 서블릿으로 지정한다.
=> 이후 모든 서블릿 요청은 DispatcherServlet에서 처리허개 된다.
bean의 내용을 xml로 등록하는 방법
- <bean id="참조변수명" class="클래스 이름"></bean>
- ex)
<bean id="homeController" class="com.tistory.codingtrainee.HomeController"></bean>
=> HomeController hc = new HomeController();
bean을 자동으로 검색하도록 만드는 방법
- <context:component-scan base-package="기준이 되는 패키지 경로" />
- ex)
<context:component-scan base-package="com.tistory.codingtraine" />
bean을 설정할 때 자주 쓰이는 annotation
- @Controller : 컨트롤러 빈
- @Repository : dao(데이터베이스에 관한 작업) 빈
- @Service : 서비스(비즈니스에 관한 로직) 빈
- @Inject : 의존관계를 넣어준다.
- @autowired : 각 상황의 타입에 맞는 IoC컨테이너 안의 빈을 자동으로 넣어준다.
Spring Maven 디렉토리의 구조
- src/main/java : 자바 코드들이 들어간다. (Controller, Model, Service)
- src/main/resources : 자바 코드에서 참조하는 리소스 파일들이 들어간다.
ex) sqlMapConfig.xml, mybatis에서의 mapper 등 - src/test/java : 개발이 어느정도 완료되면 JUnit등을 통한 테스트에 쓰이는 코드들이 들어간다.
- srs/test/resources : 테스트 코드들이 참조하는 리소스 파일들
- src/main/webapp : 웹 서비스에 대한 루트 폴더 (외부에서 접근이 가능하다.)
- src/main/webapp/resources : js, css, image 등 웹 리소스 파일들이 들어간다.
- src/main/webapp/WEB-INF/classes : 컴파일 완료된 클래스들이 들어간다.
- 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 : 보안을 위해 외부에서는 접근이 불가능하다. 단, 컨트롤러를 경유해서는 접근이 가능하다.
- pom.xml : Maven에서 참조하는 설정 파일이다.
Spring의 주요한 특징
- POJO(Plain Old Java Object) 기반의 구성 : 별도의 API가 필요하지 않고 일반 자바 코드만으로 개발이 가능하다.
- 의존성 주입(DI)를 통해 객체간의 관계를 구성하게 된다.
- AOP(Aspect Oriented Programming) 지원 : 반복되는 코드를 줄이고 개발자가 비즈니스 로직에만 집중이 가능하도록 지원한다.
- 개발에 편리한 MVC구조로 이루어져 있다.
- WAS에 종속적이지 않은 개발 환경을 제공해준다.
IoC (Inversion of Control, 제어의 역전)
- 객체에 대한 제어권을 의미한다.
- 기존에는 개발자에게 객체 제어권이 있었다. (new 연산자)
- Spring이 등장한 후에는 객체 제어권을 Spring에게 넘겨주게 되었다.
- 인스턴스의 생명주기를 개발자가 아니라 Spring Framework가 담당하게 된다.
DI (Dependency Injection, 의존관계 주입)
- 객체간의 의존성을 개발자 대신 Spring Container가 주입시켜주는 기능이다.
- 객체를 더욱 쉽게 확장하며 재사용이 가능해진다.
강한 결합관계와 느슨한 결합관계의 예
// 생성자가 private으로 바뀌면 PersonDo 클래스도 함께 수정해야 한다.
class PersonDo {
public PersonDo() {
Person p = new Person();
}
}
public class Person {
String userEmail;
String password;
String name;
private Person() {
}
}
=> 강한 결합관계의 예
// 생성자가 private로 바뀌게 되더라도 메인 클래스에 영향을 주지 못한다.
class PersonDo {
public PersonDo(Person p) {
}
}
public class Person {
String userEmail;
String password;
String name;
private Person() {
}
}
=> 느슨한 결합관계의 예
Logging Tools
로깅을 위한 도구를 사용하는 이유
- System.out.println() 명령어는 IO에 대한 리소스를 많이 사용하게 되어 시스템이 느려질 가능성이 있다.
- 로그를 콘솔에서 일회성으로 소모하는 대신 파일로 저장하여 분석할 필요성이 있다.
Logging Tool의 종류
- commons-logging : Spring 3에서 주로 사용되던 도구.
- log4j : 효율적인 메모리 관리 능력으로 인해 많이 사용되어왔다.
- logback : log4j에 비해 더 우수한 성능으로 인해 많이 사용되는 추세
- SLF4J : logback을 사용하기 위한 인터페이스
Logback에 대해
- 자바의 오픈소스 로깅 프레임워크로 스프링 부트에서는 기본 로그 객체로 쓰인다.
- Logback의 설정파일은 크게 appender와 logger의 두 부분으로 나뉜다.
- appender는 어디에 어떻게 로그를 사용할 것인가에 대한 설정을 하는 부분이다.
- appender의 종류
- ConsoleAppender : 콘솔에 로그를 찍도록 한다.
- FileAppender : 파일에 로그를 찍는다.
- RollingFileAppender : 여러개의 파일에 번갈아 로그를 찍는다.
- SMTPAppender : 로그를 메일에 찍어 전송한다.
- DBAppender : 데이터베이스에 로그를 찍는다.
- SocketAppender, SSLSocketAppender 등 - logger는 appender들을 참조하며 해당 로거가 사용될 패키지와 로그 레벨을 지정해준다.
- 로그의 레벨
- Debug : Debug, Info, Warn, Error를 모두 포함한다.
- Info : Info, Warn, Error를 포함한다.
- Warn : Warn과 Error를 포함한다.
- Error : Error만 포함한다.
SLF4J 설정하기
- pom.xml에 slf4j-version을 최신 버전으로 설정하기
이를 위해서는 mavenrepository사이트를 활용할 수 있다.
- pom.xml에서 로깅에 대한 의존성을 모아놓은 부분에 logback에 대한 코드를 추가해주기
<!-- 버전은 베타나 알파버전이 아닌 최신 버전을 유지하는 것이 좋다. -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
- src/main/resources경로에 logback.xml파일 작성
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<logger name="jdbc.sqlonly" level="DEBUG" />
<logger name="jdbc.sqliming" level="INFO" />
<logger name="jdbc.audit" level="WARN" />
<logger name="jdbc.resultset" level="ERROR" />
<logger name="jdbc.resultsettable" level="ERROR" />
<logger name="jdbc.connectioin" level="INFO" />
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss:SSS} [%thread] %-4level [%logger.%method:%line] - %msg %n</pattern>
</layout>
</appender>
<appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/WEB-INF/logback.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logback.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 30일이 지난 파일은 삭제하도록 조치한다. -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} %d-4level [%logger.%method:%line] - %msg %n</pattern>
</encoder>
</appender>
<!-- 로그 레벨 설정(지정된 로그 레벨 이상만 수집한다.) : DEBUG < INFO < WARN < ERROR < FATAL -->
<logger name="myweb" additivity="false">
<level value="INFO" />
<appender-ref ref="LOGFILE" />
<appender-ref ref="CONSOLE" />
</logger>
<root>
<level value="INFO" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
- 로그를 수집하고자 하는 클래스에 해당 변수를 선언한다.
// private를 통해 외부에서 로그를 가로채지 못하도록 만들어 보안성을 증가시켜준다.
// static final키워드를 넣어줌으로서 로그 내용이 바뀌지 않도록 해준다.
private static final Logger logger = LoggerFactory.getLogger(클래스명.class);
- 로그를 수집할 메소드에서 로그 수집을 위한 명령어를 호출한다.
logger.info("로그 제목", 확인할 값);
참고 1 : https://jeong-pro.tistory.com/154
참고 2 : https://jamong-icetea.tistory.com/177
'프로그래밍 > Spring' 카테고리의 다른 글
계속 쓸 Spring 개념 (0) | 2020.01.01 |
---|---|
Oracle DB환경 구축한 후 Spring과 연동해보기 (0) | 2019.12.16 |
Eclipse환경에서 Spring MVC 프로젝트 생성하기 (0) | 2019.12.15 |
intellij를 통한 Spring MVC, Maven 프로젝트 생성하기 (0) | 2019.12.15 |