주간 랩업/[SSG] JAVA 기반 백엔드 개발 과정

[13주차] 스프링 1~5일차

hooooolly 2024. 9. 7. 22:39
스프링 1일 차
2024/9/2

 

오늘은 인텔리제이 Ultimate 버전을 설치하고 스프링 프로젝트를 생성해 보았다.

스프링은 프레임워크 1.0은 2004년 출시되었는데, 스프링 이전 EJB로 개발할 때의 단점을 보완해 주었다. 

EJB는 전체 애플리케이션을 배포해서 테스트를 진행해야 했는데, 스프링은 의존성 주입을 도입하여 간소화된 단위 테스트를 가능하게 해 주었다. 이것은 생산성 향상, 빠른 결함 발견, 그리고 결함을 예방하는 결과로 이어졌다.

스프링은 중앙 집중식 예외처리를 수행할 수 있고 AOP(관점 지향 프로그래밍)를 사용해 중복된 코드를 제거할 수 있다.

스프링 프레임워크는 라이브러리와 달리 전체 애플리케이션의 흐름을 제어하고, 스프링 코어 모듈 위에 독립적인 모듈을 올려서 통합하여 사용한다.

 

스프링 환경을 같이 알아봤는데 지금까지 해왔던 자바의 개념과는 완전히 달라서 이해하기 어렵다. 추가적으로 책을 봐야 할 거 같다. 스프링 컨테이너의 작동 원리라던가 각 패키지의 의미라던가 중요 모듈에 대해서 알아보고 블로그에 따로 올리고 싶은데 가능할지는 모르겠다...

 

 

 

스프링 2일 차
2024/9/3

 

스프링 프레임워크의 특징으로는 DI (의존성 주입)이  있는데 의존하는 부분을 외부에서 주입하는 방식이다. 

DI 컨테이너에게 인스턴스 생성을 맡길 때 주의해야 할 규칙이 있는데 첫째, 의존하는 부분은 인터페이스를 이용한다. 둘째, new 키워드를 통해 인스턴스를 생성하지 않는다. 셋째, 어노테이션을 클래스에 부여한다. @Bean, @Service 등 어노테이션을 부여해서 스프링 프레임워크가 인스턴스를 생성하도록 한다. 넷째, @Autowired를 필드 위에 부여한다.

 

VO와 DTO 클래스는 빈을 등록하지 않는데, 그 이유를 알아보니 데이터 중심의 객체이기 때문에 데이터 보관용 (비즈니스 로직을 처리하지 않음)이 주요 역할이어서 빈으로 등록하지 않았다.

그렇다면 xml과 어노테이션으로 처리하는 객체를 어떻게 판단할까? 그 기준은 코드를 수정할 수 있느냐에 따라 달라졌다. 직접 작성하는 클래스의 경우 어노테이션을 사용하고  jar 파일로 추가되는 객체인 경우 XML의 <bean>으로 처리한다.

 

그리고 스프링 프레임워크에서 웹과 관련된 작업을 하기 위해 (웹 애플리케이션을 사용하기 위해) spring-webmvc 라이브러리를 추가해 주었고 WAS(톰캣)과 스프링이 연동되는 구조를 만들었다. 그리고 데이터베이스는 HikariCP를 사용하여 연결했다.

 

스프링 3일 차
2024/9/4

 

3일 차는 HTTP의 통신 과정과 메시지 구성, URI에 대해 알아보았다. 요청과 응답은 하나로 묶어서 처리된다는 점을 알게 되었다. 그리고 웹은 기본적으로 비연결성인 특징을 가지는데 최대한 많은 사용자에게 서비스를 제공하기 위해 요청과 응답을 처리한 후에는 연결을 종료해 주는 것을 알게 되었다. 

 

서블릿은 서버에서 요청과 응답을 동적으로 처리하는 API를 정의한 것으로 WAS에서 서블릿 API를 이용해서 코드를 작성 성한다.  그러면 WAS는 서블릿 클래스의 객체를 관리한다. 서블릿과 JSP는 J2SE API와 서블릿 API를 함께 사용해서 개발한다. 

 

현재 자바에서는 JSP는 입력 화면을 구성하거나 처리 결과를 출력하는 용도로 사용되고 있다. 왜냐하면 GET/POST 방식을 구분하지 않아 POST 방식으로 접근해야 하는 리소스도 GET으로 호출할 수 있고 유지보수도 불편하기 때문이다. 그래서 우리는 서블릿 경로를 통해 JSP를 호출한다. 

 

 

스프링 4일 차
2024/9/5

 

WebMVC 패턴은 역할을 분리해서 처리하는 구조이고 WebMVC 패턴에서 자주 보이는 PRG 패턴은 POST-Redirect-Get 패턴으로 POST와 Redirect를 결합하여 사용하는 패턴이다. 

오늘은 위 패턴을 사용하여 조회와 수정, 삭제가 가능한 간단한 웹을 만들어보며 데이터의 이동을 학습했다.

 

 

스프링 5일 차
2024/9/6

 

오늘은 3 tier layer에 따라 DTO와 VO 클래스를 구분하고 ModelMapper 라이브러리를 사용하여 편리하게 클래스의 변환을 하는 기능을 추가해 보았다. 그리고 log4j2를 사용해서 로그를 출력해 보았다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration stattus="INFO">
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout charset="UTF-8" pattern="%d{hh:mm:ss} %5p [%c] %m%n"/>
        </Console>
    </Appenders>
    <loggers>
        <logger name="org.springframework" level="INFO" additivity="false">
            <appender-ref ref="console"/>
        </logger>
        <logger name="com.ssg" level="INFO" additivity="false">
            <appender-ref ref="console"/>
        </logger>
        <root level="INFO" additivity="false">
            <AppenderRef ref="console"/>
        </root>

    </loggers>
</configuration>

 

@Log4j2를 부여해서 로그 기능을 호출할 수 있었다.