다운캐스팅, session 무효화

이소연's avatar
Aug 05, 2024
다운캐스팅, session 무효화
데이터베이스랑 자바세상은 다르니까 데이터베이스의 자료를 자바로 가져와야 하니까 형변환
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::newProduct 객체를 받아서 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();:
      • productServicegetProductList 메서드를 호출하여 모든 제품 목록을 가져옵니다. 이 목록은 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

Coding's note