본문 바로가기

프로그래밍/Spring

Spring 기초 개념 잡기

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을 참조하도록 설정을 변경한다면 문제가 해결된다.

Missing문제 발생




이후 java jdk가 설치된 폴더를 선택 후 apply한다


 

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사이트를 활용할 수 있다.

https://mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

Dashbuilder Displayer Screen Last Release on Dec 10, 2019

mvnrepository.com

SLF4J의 버전을 최신 버전으로 유지하기


  • 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

 

강력한 자바 오픈소스 로깅 프레임워크, logback 사용법 with example(스프링 부트에서 logback 가이드, logback-spring.xml 설정하기)

Logback 소개 Logback은 "자바 오픈소스 로깅 프레임워크"로 SLF4J의 구현체이자 스프링 부트의 기본 로그 객체다. log4j, log4j2, JUL(java.util.logging)과 성능을 비교했을 때 logback은 훌륭한 성능을 보여준..

jeong-pro.tistory.com

참고 2 : https://jamong-icetea.tistory.com/177

 

[Eclipse] Missing 'tools.jar'

이클립스를 실행했을 때 위와 같은 에러가 발생했다. 프로젝트를 익스플로러에 오픈으로 열었는데 발생했다. 이유는 JDK와 JRE가 설치되어 있는 환경에서 프로젝트의 JRE가 PC에 설치된 JRE 폴더의 VM을 참조해서..

jamong-icetea.tistory.com