inblog logo
|
Coding's note
    P) Fruit Market

    다운캐스팅, session 무효화

    이소연's avatar
    이소연
    Aug 05, 2024
    다운캐스팅, session 무효화
    Contents
    세션 무효화스트림에 뿌리고 가공ProductController
    데이터베이스랑 자바세상은 다르니까 데이터베이스의 자료를 자바로 가져와야 하니까 형변환
    Buyer sessionBuyer = (Buyer) query.getSingleResult(); 데이터베이스랑 자바세상은 다르니까 데이터베이스의 자료를 자바로 가져와야 하니까 형변환한다! ChatGPT 네, 맞습니다. Buyer sessionBuyer = (Buyer) query.getSingleResult(); 이 코드는 데이터베이스에서 가져온 결과를 자바 객체로 변환하는 과정을 나타냅니다. 좀 더 구체적으로 설명하면 다음과 같습니다: 데이터베이스와 자바 객체 간의 차이 데이터베이스: SQL 쿼리를 통해 테이블에서 데이터를 검색합니다. 데이터베이스는 테이블의 각 행을 결과로 반환합니다. 이 결과는 일반적으로 데이터베이스의 기본 데이터 타입으로 구성된 필드들의 집합입니다. 자바 객체: 자바에서는 데이터베이스의 행을 객체로 매핑하여 사용합니다. 객체는 클래스의 인스턴스로, 클래스는 필드와 메서드를 가지고 있습니다. 형변환 (캐스팅) 데이터베이스 결과: query.getSingleResult() 메서드는 네이티브 SQL 쿼리의 결과를 가져옵니다. 이 결과는 일반적으로 Object 타입으로 반환됩니다. 자바 객체로 변환: 이 결과를 자바 객체로 사용하려면 해당 객체로 형변환(캐스팅)해야 합니다. java) Buyer sessionBuyer = (Buyer) query.getSingleResult(); 쿼리 실행: query.getSingleResult()는 데이터베이스에서 쿼리를 실행하고, 결과를 단일 객체로 반환합니다. 형변환: 반환된 객체는 기본적으로 Object 타입입니다. 이를 Buyer 타입으로 변환하여 sessionBuyer 변수에 저장합니다. 이 과정을 형변환 또는 캐스팅이라고 합니다. 예시를 통한 이해 데이터베이스에서 데이터 가져오기: 예를 들어, 데이터베이스의 buyer_tb 테이블에서 특정 조건을 만족하는 행을 가져옵니다. Object로 반환: query.getSingleResult()는 이 행을 Object 타입으로 반환합니다. Buyer 객체로 캐스팅: 반환된 Object를 Buyer 타입으로 캐스팅하여 자바에서 사용합니다. 이 과정은 데이터베이스와 자바 애플리케이션 간의 데이터 교환을 가능하게 합니다. 데이터베이스의 데이터를 자바 객체로 변환하여 자바 애플리케이션에서 사용할 수 있게 됩니다. 따라서, Buyer sessionBuyer = (Buyer) query.getSingleResult(); 이 코드는 데이터베이스에서 가져온 데이터를 자바 객체(Buyer)로 변환하는 것을 의미하며, 데이터베이스의 자료를 자바로 가져오기 위해 형변환을 한다고 이해하면 됩니다.
     

    세션 무효화

    session.invalidate(); 는 현재 세션을 무효화하여 세션 데이터를 삭제하는 작업을 수행합니다. 구체적으로는 사용자가 웹 애플리케이션과의 상호작용을 통해 생성된 세션 객체와 그와 관련된 모든 정보를 제거하는 것입니다.
     

    스트림에 뿌리고 가공

    Java 스트림 API를 사용하여 productList의 각 Product 객체를 ProductResponse.ListDTO 객체로 변환한 후, 이를 리스트로 수집하는 작업을 수행합니다. 코드를 단계별로 설명해 보겠습니다:

    코드 설명

    java코드 복사 public List<ProductResponse.ListDTO> getProductList() { // productRepository에서 모든 Product 객체를 가져옵니다. List<Product> productList = productRepository.findAll(); // productList를 스트림으로 변환합니다. return productList.stream() // 각 Product 객체를 ProductResponse.ListDTO 객체로 변환합니다. .map(ProductResponse.ListDTO::new) // 변환된 ListDTO 객체들을 리스트로 수집합니다. .collect(Collectors.toList());

    단계별 설명

    1. productRepository.findAll(): 이 메서드는 데이터베이스에서 모든 Product 객체를 조회하여 productList에 저장합니다.
    1. productList.stream(): productList를 스트림으로 변환합니다. 스트림은 컬렉션의 요소들을 함수형 스타일로 처리할 수 있게 해주는 연속된 데이터 흐름입니다.
    1. .map(ProductResponse.ListDTO::new): 스트림의 각 Product 객체에 대해 ProductResponse.ListDTO 생성자를 호출하여 ListDTO 객체로 변환합니다. 이 부분에서 각 Product 객체를 ListDTO 객체로 매핑(변환)합니다.
        • ProductResponse.ListDTO::new는 Product 객체를 받아서 ListDTO 객체를 생성하는 생성자 참조입니다. 이 참조는 Product 객체를 인수로 받아서 새로운 ListDTO 객체를 생성하는 람다 표현식 (product) -> new ProductResponse.ListDTO(product)와 동일한 역할을 합니다.
    1. .collect(Collectors.toList()): 변환된 ListDTO 객체들을 리스트로 수집합니다. 스트림의 결과를 다시 리스트로 변환하여 반환합니다.
     

    예제

    만약 productList에 다음과 같은 Product 객체들이 있다고 가정해 봅시다:
    java코드 복사 List<Product> productList = Arrays.asList( new Product(1, "Product1", 100, 10), new Product(2, "Product2", 200, 20), new Product(3, "Product3", 300, 30) );
    이 코드는 다음과 같이 동작합니다:
    1. productList.stream()을 호출하여 productList를 스트림으로 변환합니다.
    1. 각 Product 객체를 ProductResponse.ListDTO 객체로 변환합니다. 예를 들어, new ProductResponse.ListDTO(product1)은 product1을 받아서 새로운 ListDTO 객체를 생성합니다.
    1. 변환된 ListDTO 객체들을 리스트로 수집합니다.
    결과적으로 List<ProductResponse.ListDTO> 타입의 리스트가 반환됩니다. 이 리스트에는 각 Product 객체에 대응하는 ListDTO 객체들이 포함되어 있습니다
     

    ProductController

    코드 해석

    java코드 복사 @GetMapping({"/product", "/"}) public String list(HttpServletRequest request) { // ProductService를 통해 모든 제품의 목록을 조회하여 productList에 저장합니다. List<ProductResponse.ListDTO> productList = productService.getProductList(); // HttpServletRequest 객체에 "productList"라는 이름으로 조회한 제품 목록을 설정합니다. request.setAttribute("productList", productList); // "product/list"라는 뷰의 이름을 반환합니다. 이 뷰는 제품 목록을 보여주는 페이지입니다. return "product/list"; }

    단계별 설명

    1. @GetMapping({"/product", "/"}):
        • 이 애노테이션은 이 메서드가 /product와 / 경로로 들어오는 HTTP GET 요청을 처리하도록 지정합니다. 즉, 사용자가 /product 또는 / URL에 접근하면 이 메서드가 실행됩니다.
    1. public String list(HttpServletRequest request):
        • list 메서드는 HttpServletRequest 객체를 매개변수로 받습니다. 이 객체는 HTTP 요청에 대한 정보를 제공합니다.
    1. List<ProductResponse.ListDTO> productList = productService.getProductList();:
        • productService의 getProductList 메서드를 호출하여 모든 제품 목록을 가져옵니다. 이 목록은 ProductResponse.ListDTO 객체들의 리스트입니다.
        • ProductService 클래스의 getProductList 메서드는 데이터베이스에서 모든 제품을 조회하고 이를 ListDTO 형태로 변환한 리스트를 반환합니다.
    1. request.setAttribute("productList", productList);:
        • HttpServletRequest 객체에 "productList"라는 이름으로 조회한 제품 목록을 속성으로 설정합니다. 이는 뷰에서 이 속성에 접근할 수 있게 합니다. 즉, JSP나 다른 뷰 템플릿에서 productList를 사용하여 제품 목록을 표시할 수 있습니다.
    1. return "product/list";:
        • "product/list"라는 뷰의 이름을 반환합니다. 이 반환된 뷰 이름은 Spring MVC에서 뷰 리졸버에 의해 처리되어 실제로 사용자에게 보여줄 페이지로 변환됩니다.
        • 예를 들어, "product/list"는 src/main/resources/templates/product/list.html와 같은 템플릿 파일을 의미할 수 있습니다.

    전체 동작 요약

    1. 사용자가 /product 또는 / URL에 접근하면 이 메서드가 호출됩니다.
    1. ProductService를 통해 데이터베이스에서 모든 제품 목록을 조회합니다.
    1. 조회한 제품 목록을 HttpServletRequest 객체에 "productList"라는 이름으로 설정합니다.
    1. "product/list"라는 이름의 뷰를 반환하여, 이 뷰에서 제품 목록을 사용하여 사용자에게 제품 목록 페이지를 표시합니다.
    Share article
    Contents
    세션 무효화스트림에 뿌리고 가공ProductController

    Coding's note

    RSS·Powered by Inblog