ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day95. @SessionAttributes, 스프링부트
    기록 2023. 1. 17. 13:04

    OrderForm 객체가 계속해서 새로 만들어지기 때문에 앞에서 저장한 내용이 안들어있다.

    따라서, 간단한 수정작업은 지금까지 사용한 방법을 사용해도 되지만, 여러 단계에 걸친 입력폼 수정작업이 필요한 작업은 model안에 form을 담고 @SessionAttributes 어노테이션을 사용한다.

    @SessionAttributes({"form"})은 model에 "form"이라는 이름으로 저장된 객체를 HttpSession객체의 속성으로 저장시킨다. 

    세션은 안사라지니까 OrderForm이 안사라진다. 페이지를 옮겨다녀도 객체가 유지되도록 하고 싶은 것이다.

     

    @SessionAttributes({"form"})

    public class OrderController {

         @RequestMapping("/order")

          public String form(Model model) {

                  OrderForm form = new OrderForm();

                  model.addAttribute("form", form);

                  return "order.form-step-1";

          }

    }

     

    @PostMapping("/order/step-1")

    public String step1(@ModelAttribute("form") OrderForm form) {  /// @ModelAttribute("form")이 없으면 OrderForm 객체가 새로 만들어질 것이다.

        // OrderForm 객체에 주문상품정보가 저장된다.

       return "order/form-step-2";

     

    * 요청객체 혹은 세션객체에서 "form"이라는 속성명으로 저장된 객체를 조회한다.

    * 앞단계에서 세션객체에 "form"으로 저장된 OrderForm객체를 가져와서 주문정보를 저장한다.

    @ModelAttribute가 필요한경우

    1. 여러 단계의 폼 입력이 필요할 때 쓰인다.

    2. 수정작업에 쓰인다.

    - 수정작업은 항상 조회와 업데이트 작업이 한번 이상 실행된다.

    - 수정화면에서 새로 입력한 내용이 반영된 PostModifyForm 객체가 요청핸들러메소드에 전달된다. 

     

    sessionStatus.setComplete();

    // SessionStatus객체는 세션에 저장된 객체를 삭제한다.

    // 단, SessionStatus는 이 컨트롤러의 @SessionAttributes 어노테이션에서 지정한 속성명으로 저장된 객체만 삭제한다. (다지워버리면 로그아웃되버리니까)


    Spring과 Spring Boot

    - Spring (5.3)

       * 자바 엔터프라이즈 애플리케이션 개발을 지원하는 오픈소스 프레임워크다.

       * 특징

            * POJO(Plain Old Java Object) 을 사용해서 자바 엔터프라이즈 애플리케이션을 개발한다.

                  POJO - 순수 자바객체

                               특별한 외부라이브러리를 가져와서 사용하지 않는 자바객체

                               특별한 실행환경에 종속되지 않는 자바객체

                               POJO는 재사용하기 쉽다.

                               POJO는 테스트하기 쉽다.

                               POJO는 코드가 단순하고, 디버깅하기 쉽다.

     

    (사실 지금의 Spring은 POJO가 아니지만, 예전의 EJB에 비해서는 POJO에 가깝다)

     

          * IoC/DI의 구현체다.

                IoC(Inversion of Control : 제어역전)

                  자신이 사용할 객체를 스스로 생성하지 않고, 외부로부터 전달받거나, 생성된 객체를 검색해서 사용하는 것을 말한다. 

                  제어역전은 자신이 사용할 객체를 획득하는 방법이 역전(뒤바뀜)되었다는 의미다.

                  Spring Container는 IoC의 구현체다.

                  IOC의 종류

                         의존성 주입 - DI(Dependency Injection) 

                         의존성 검색 - DP(Dependency Pull), DL(Dependency Lookup)

                  DI(Dependency Injection : 의존성주입)

                      자신이 사용할 객체를 스스로 생성하지 않고, 제 3자(Spring Container)로부터 제공(주입)받는 것이다.

                      스프링에서는 @Autowired를 이용해서 자동 의존성 주입을 지원한다.

                      * 스프링과 스프링 컨테이너

                            스프링은 프레임워크다.

                            스프링 컨테이너는 구현 클래스다.

                            스프링 컨테이너는 스프링 빈 설정정보를 읽어서 객체를 생성하고, 객체간의 의존관계를 파악해서 의존성 주입 작업을 수행하는 객체다.

     

          * AOP의 구현체다.

                 AOP(Aspect Oriented Programming)는 관점지향 프로그래밍이다.

                 AOP는 기능을 공통관심사항(로깅, 트랜잭션처리, 예외처리)과 핵심관심사항(업무로직)으로 구분해서 개발하는 것이다.

                 AOP는 공통관심사항을 별도의 클래스로 구현하고, 핵심관심사항이 구현된 메소드가 실행될 때 지정된 공통관심사항이 같이 실행되게 하는 것이다. 

                 AOP를 사용하면 개발자가 구현하는 메소드에는 핵심관심사항만 남아있게 된다. (개발자는 업무로직의 구현에만 집중하면 된다.)

                       * 선언적 트랜잭션처리는 AOP를 이용하는 것이다.

                 AOP는 코드의 중복을 제거한다.

                 AOP는 코드가 간결해지고, 유지보수를 쉽게한다.  

     

         * 다양한 모듈로 구성되어 있다.

               Test 모듈

                      spring-test.jar : spring application에 대한 테스트를 지원한다.

              Core Container 모듈

                     spring-beans, spring-core, spring-context : 객체 생성, 의존성 주입, 국제화처리 등을 지원하는 spring container를 제공한다.

                     spring-expression : spring EL 지원한다. (스프링 전용 언어)

              AOP 모듈

                    spring-aop : 관점지향프로그래밍을 지원한다.

              DataAccess 모듈

                   spring-jdbc : jdbc를 활용한 데이터베이스 엑세스를 지원한다.

                   spring-tx : 트랜잭션처리를 지원한다.

                   spring-orm : 객체-관계 매핑프레임워크(ORM: object-Relational Mapping)와의 연동을 지원한다.

                                        객체와 테이블을 매핑해서 데이터베이스 엑세스 작업을 수행한다. 

                                        (sql과 객체를 연결하는게 아니라 테이블을 객체와 연결하는 방법으로, 테이블을 그대로 표현한 객체에 값을 담으면 자동으로 sql이 생성되어서 db에 들어간다.) 

              Web 모듈

                  spring-web : 웹 환경에 최적화된 spring container를 제공한다.

                  spring-webmvc : mvc 패턴의 웹 애플리케이션개발을 지원한다.

                  spring-websocket : 웹소켓기능을 지원한다. (클라이언트가 서버에 요청을 보내지 않아도 서버에서 자동으로 알려주는 기능, 채팅기능 구현에 필요함) (기존 http는 클라이언트 측에서 요청이 있어야만 서버에서 값을 불러올 수 있음)

     

    - Spring Boot

     * spring framework를 기반으로 하는 하위 프로젝트다.

     * XML이나 추가적인 코드 작성없이 바로 실행할 수 있는 독립 실행형 Spring Application을 빠르게 제작할 수 있도록 지원한다. 

     * 특징

           - 독립실행형 애플리케이션

                 * 플랫폼(하드웨어나 운영체제)에 종속되지 않고 인터넷 연결이나 기타 서비스 설치없이 바로 작동하는 애플리케이션을 개발할 수 있다. 

           -  내장형 서버

                * Tomcat, Jetty 등의 내장형 서버를 포함하고 있다. 

           - 의견 제시형 접근 방식의 개발

                * 의견제시형 접근방식을 이용해서 애플리케이션을 구성한다. (방식이 정해져있음)

                * 의견제시형 접근방식은 소프트웨어 디자인에 있어서는 소프트웨어 개발자의 자유도를 제한해서 작업을 미리 지정된 방식으로 진행하도록 하는 것이다.

               예시) Connection Pool을 만드는 방법은 한가지 밖에 없다. 방식이 정해져 있으니까 설정의 자유도를 낮춘다. 자질구레한 설정을 할 필요가 없게 되는 것이다. 

         - 자동구성  

           * 프로젝트에 새로운  라이브러리가 포함될 때마다 해당 라이브러리와 관련된 구성을 자동으로 수행한다.

           * 새로운 라이브러리가 포함될 때 마다, 미리 정해진 방식으로 설정된 정보를 읽어서 자동으로 애플리케이션을 구성한다. 

     

    new > project > spring boot > Spring Starter Project

    name : 프로젝트 이름

    type : 빌드 방식 (Gradle이 성능이 더 좋지만 Maven을 많이 씀)

    Packaging : War(JSP기반 웹 어플리케이션일 때 사용), Jar

    Java Version : 11

    Package : com.example

    Spring Boot Version : 2.7.7

    dev : 수정하면 서버가 자동으로 껐다켜지게 하는 기능 (스프링부트는 톰캣이 내장되어 있다.)

    Project Dependency : 사용할 라이브러리 선택 (Spring Web, Oracle Driver, MyBatis Framework, Lombok, Spring Boot DevTools 선택)

    lombok :  Java 라이브러리로 반복되는 getter, setter, toString 등의 메서드 작성 코드를 줄여주는 코드 다이어트 라이브러리(출처 : https://dololak.tistory.com/783)

     

    라이브러리 추가 후 Finish > 마우스 오른쪽 버튼 > Maven > Update Project

     

    pom.xml에는 라이브러리 의존성이 잘 맞는 것들이 자동으로 적혀져 있다.

     

    오른쪽버튼 > Spring > Add Starters 클릭하면 New Spring Starter Project Dependencies 창이 다시 열려서 추가할 수 있다.

     

    com.example 패키지의 SpringBootWebApplication클래스

    @SpringBootApplication 어노테이션이 붙은 프로젝트 이름을 따서 만들어진 SpringBootWebApplication클래스는 스프링부트어플리케이션의 진입점이 되는 main클래스임을 나타낸다. 

    @SpringBootApplication 어노테이션을 클릭해서 보면 @ComponentScan을 포함해서 다양한 어노테이션이 부착되어 있음을 확인할 수 있다.

    com.example 패키지 하위에 위치한다. com.example 하위에 패키지(com.example.vo 등)를 만들 것임.

    @ComponentScan이 com.example패키지 및 그 하위 클래스에서 클래스를 자동으로 스캔한다. 

     

    톰캣 서버가 내장되어 있기 때문에 톰캣서버에 배포할 필요가 없다.

    오른쪽버튼 Run As > Spring Boot App 클릭

    DataSource 'url'이 설정이 안되어있어 오류가 났음을 확인할 수 있다.

    Oracle jdbc 라이브러리가 포함되어 있을 때 미리 정해진 방식으로 DataSource 커넥션풀을 만드는 것이 약속되어 있는데 설정을 안해놔서 에러가 난 것임.

    application.properties 파일을 application.yml로 변경한다. (yml이 작성하기가 더 편하다.) 

     

    No MyBatis mapper was found in '[com.example]' package. Please check your configuration.

    MyBatis 라이브러리가 포함되어 있어서 자동구성하려고 하는데 mapper파일이 없다고 경고가 뜨는 것임 

    자동구성으로 인해 표시되는 것임!!

     

    스프링부트는 jsp를 지원하지 않는다. 따라서 pom.xml의 47번째 코드를 주석으로 막고,

    아래와 같은 코드를 작성해줘야 한다.

    <!-- 
    			spring boot에서 제공하는 내장형 톰캣은 JSP를 지원하지 않는다.
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    			<scope>provided</scope>
    		</dependency> 
    		-->
    		<!-- JSP를 지원하는 내장형 톰캣 라이브러리 의존성 추가 -->
    		<dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
            <!-- JSTL 태그 라이브러리 의존성 추가 -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
    		<dependency>
            	<groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>

    Boot Dashboard 여는 방법 (스프링부트 서버를 쉽게 켤 수 있음)

    Window > Show View > Other > Spring > Boot Dashboard 클릭

     

    스프링에서 추천하는 템플릿 엔진 

    thymleaf 뷰 템플릿 엔진 

    - 확장자가 html이다. (톰캣 실행 없이도 브라우저에서 열 수 있다. 웹서버가 필요한 jsp 사용을 꺼리는 것임.)

    - thymleaf 표기 방식


    스프링부트 설정방법 : application.yml과 applictaion.properties

     

    application.yml의 설정 예 (들여쓰기는 반드시 2칸씩, : 뒤에 한칸 띄우기를 반드시 지켜야 한다.)

    applictaion.properties의 설정 예 (spring.datasource.을 다 적어줘야 한다. yml과 달리 계층구조가 없어서)

    => application.yml을 사용하는 이유는 전자정부 표준 프레임워크에서 application.properties는 자동완성이 안됨.

    yml 설정방식이 계층구조로 되어있어서 보기가 편함. 

     

    com.example.mapper 패키지의 UserMapper.java 클래스에 @Mapper 어노테이션만 붙여줘도 아까전에 나타났던 mybatis warning이 뜨지 않는다. 

     

    mybatis 설정

    mybatis:
      mapper-locations:
      - mybatis/mappers/*.xml   // Mapper파일의 위치를 알려준다.
      configuration:
        jdbc-type-for-null: null   // null값 ( null값이 허용되는 컬럼에 null값이 저장될 때 값의 타입을 null로 지정한다. )
        log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl      // Mybatis 실행할 때 sql이 출력되도록 함

     


    내일부터는 스프링부트로 스프링시큐리티를 적용해 볼 것임.

    스프링시큐리티는 보안을 담당

    인증작업(Authentication)

         - 가입한 사용자가 맞는지 확인하는 작업

    인가작업(Authorization)

         - 요청한 서비스를 사용할 권한을 가지고 있는지 확인하는 작업 (관리자 권한, 유저 권한 확인)

     

    REST API (자원(데이터)의 상태를 관리하는 서비스)

            - JSON 형식의 데이터를 교환한다. 

            - URI는 자원에 대한 식별자다.

            - 자원에 대한 동작은 HTTP method로 표현한다.

    요청방식은 어떤 작업을 할 지 나타낸다.

    URI는 어떤 자원에 대한 것인지 나타낸다.

    요청데이터와 응답데이터는 json으로 주고 받는다. 

    REST API는 마이크로서비스와도 연관이 있다. 

     

    댓글

Designed by Tistory.