일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 오라클
- 참조형변수
- 생성자오버로드
- 환경설정
- 사용자예외클래스생성
- 자동차수리시스템
- 어윈 사용법
- 컬렉션 타입
- 한국건설관리시스템
- abstract
- GRANT VIEW
- 인터페이스
- 제네릭
- 자바
- 정수형타입
- 추상메서드
- 다형성
- NestedFor
- oracle
- cursor문
- Java
- 예외처리
- 메소드오버로딩
- 집합_SET
- 객체 비교
- exception
- 예외미루기
- EnhancedFor
- 대덕인재개발원
- 컬렉션프레임워크
- Today
- Total
목록전체 글 (597)
거니의 velog
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ciUWjR/btsFyv64iJR/8fSQfZVCmw0ovsbpW0qkj1/img.png)
2. DTO와 인증 처리 서비스* 엔티티 처리를 확인했다면 서비스 계층을 만들어서 로그인 기능을 구현해 놓는다. 가장 먼저 dto 패키지에 MemberDTO 클래스를 추가한다. MemberDTO는 기존의 DTO와는 달리 스프링 시큐리티에서 이용하는 타입의 객체로 만들어서 사용하기 위해서 org.springframework.security.core.userdetails.User 클래스를 상속하는 구조로 생성하고, User 클래스의 생성자를 사용할 수 있는 구조로 작성한다(상속하는 부모 클래스의 생성자 함수 때문에 생성자 방식을 사용한다).package com.unlimited.mallapi.dto; import java.util.List; import java.util.ArrayList; import ja..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/WmG5N/btsFso8QPnb/s0XALmUNduaL6Rgcq1A6y0/img.png)
* API 서버는 기본적으로 지난번 호출에 대해 기록하지 않는 무상태(stateless) 서비스이다. 무상태(stateless) 서비스란 서버가 클라이언트의 이전 요청에 대한 정보를 기억하지 않고, 각각의 요청을 독립적으로 처리하는 특성을 말합니다. 다시 말해, 서버는 각각의 클라이언트 요청을 별개의 이벤트로 취급하며, 이전 요청의 상태나 정보를 저장하지 않습니다. 무상태 서비스의 특징은 다음과 같습니다. 1. 상태 저장 없음(Stateless): 서버는 클라이언트의 상태를 저장하지 않습니다. 클라이언트의 각 요청은 독립적이며, 이전 요청의 상태에 영향을 받지 않습니다. 이는 서버에서 세션 정보나 쿠키를 사용하지 않는다는 것을 의미합니다. 2. 성능 향상: 무상태 서비스는 서버 측에서 클라이언트의 상태를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/XGCsD/btsFAh1h3PX/QM0zcEMSnwZCpkgZY85iH1/img.png)
5. 수정/삭제 페이지와 컴포넌트 처리 * 수정/삭제를 위한 페이지는 pages/products/ModifyPage.js 파일로 작성하고, router/productsRouter.js 파일을 수정해서 라우팅 설정을 추가한다. import React from "react"; const ModifyPage = () => { return ( Products Modify Page ); }; export default ModifyPage; * router/productsRouter.js 내 ModifyPage 설정을 추가한다. import React, { Suspense, lazy } from "react"; import { Navigate } from "react-router-dom"; const product..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/sMBPy/btsFuKXWSup/2oguRkkRBROSxrzVyXkh61/img.png)
4. 조회 페이지와 조회 컴포넌트 * 조회 페이지는 pages/products/ReadPage.js로 작성한다. import React from "react"; const ReadPage = () => { return ( Products Read Page ); }; export default ReadPage; * router/productRouter.js에 ReadPage에 대한 설정을 추가한다. import React, { Suspense, lazy } from "react"; import { Navigate } from "react-router-dom"; const productsRouter = () => { const Loading = Loading....; const ProductsList = l..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/o3rTM/btsFuMVJ1PE/BunjraByvFY4SCu0Z69iK0/img.png)
3. 목록 페이지와 목록 컴포넌트 처리 * 목록 페이지와 목록 컴포넌트 처리 역시 이전의 Todo 예제와 유사하다. useCustomMove를 이용하면 이동과 관련된 처리를 쉽게 처리할 수 있고 FetchingModal을 이용해서 서버와의 통신 과정에 보여주도록 처리한다. * 우선 api/productsApi.js에는 서버에서 목록 데이터를 가져오기 위한 함수를 준비한다. import axios from "axios"; import { API_SERVER_HOST } from "./todoApi"; const host = `${API_SERVER_HOST}/api/products`; export const postAdd = async (product) => { const header = { headers..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bQK4Aw/btsFuGOAunK/34lxIEV1VgN19LH4dG1Me0/img.png)
2. 등록 페이지와 컴포넌트 처리 * 등록 작업은 AddPage.js 이름의 페이지 컴포넌트를 추가하고 라우터를 설정해 주는 것으로 시작한다. import React from "react"; const AddPage = () => { return ( Products Add Page ); }; export default AddPage; (1) 라우팅 설정 * router/productsRouter.js에는 AddPage에 대한 라우팅 정보를 설정한다. import React, { Suspense, lazy } from "react"; import { Navigate } from "react-router-dom"; const productsRouter = () => { const Loading = Loadi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eEuKRH/btsFAanjy9P/WegtA6FtIumZg5IkU1EPy0/img.png)
* 상품 API의 경우 파일 데이터가 추가된다는 점을 제외하면 JSON을 이용하는 데이터 처리방식과 유사하다. 하지만 파일 데이터가 추가되기 때문에 처리 과정에 걸리는 시간에 맞는 모달창을 보이는 등의 추가적인 부분이 필요하다. 이 장에서는 컴포넌트의 재사용을 이용해서 이러한 처리를 연습한다. * 이번 장의 개발 목표는 다음과 같다. 1. 파일이 추가되는 데이터 처리 2. 기존 공통 컴포넌트의 재사용 1. 상품 관련 React-Router 설정 * 개발하려는 상품 기능은 목록 화면에서 새로운 상품을 등록할 수 있고, 조회 화면에서는 수정/삭제 화면으로 이동이 가능하도록 구성해야 한다. 상품 등록 시에는 상품의 이미지들과 함께 추가해서 등록하게 된다. * 상품 목록 페이지는 상품들의 이미지를 같이 보여주고..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cHsUBA/btsFywEdsXN/3Mi5nCT8uneCubu2ehBXE0/img.png)
(4) 수정 기능의 처리 * 수정 기능의 처리에서 첨부파일의 처리를 주의해야 한다. ProductDTO에서는 List 타입으로 선언된 files가 존재하고, List 타입은 uploadFIleNames가 존재하는데 uploadFIleNames는 기존에 업로드된 파일들의 이름을 의미하고, files는 처리가 필요한 새로운 파일들이다. 실제 데이터베이스에 추가되는 것은 문자열로 된 uploadFIleNames 이므로 업로드 작업이 완료된 후에는 이미 업로드된 uploadFIleNames에 업로드된 파일의 이름들을 추가해서 구성해 주어야 한다. * 데이터베이스에 관련된 엔티티에서는 uploadFIleNames의 내용이 첨부파일의 이름들이기 때문에 기존의 Product 객체가 가진 모든 파일을 지우고, Prod..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cq5ztb/btsFsmJmLyI/o6IeGa2Wz7fk2zkoxJ2pp1/img.png)
(3) 조회 기능의 처리 * 조회 기능은 등록 기능과 반대로 Product와 List로 구성된 데이터를 하나의 ProductDTO로 변환해야만 한다. [서비스 조회 기능의 처리] * ProductService 인터페이스에는 파라미터로 상품의 번호(pno)를 받고, 리턴 타입은 Product의 타입인 get()을 정의한다. package com.unlimited.mallapi.service; import org.springframework.transaction.annotation.Transactional; import com.unlimited.mallapi.dto.PageRequestDTO; import com.unlimited.mallapi.dto.PageResponseDTO; import com.unl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QIHTr/btsFsb2kTpT/jyK31rPPJ1xfydKynkXpZk/img.png)
(2) 등록 기능의 처리 * 서비스 계층에 대한 테스트 코드를 작성해 보자. 테스트용 데이터는 실제 이미지가 아니기 때문에 화면에서 이미지 파일들이 제대로 보이지 않는 단점이 있기는 하지만, 서비스 계층이 정상적으로 동작하는지 확인할 수 있고 컨트롤러와 연동이 완료되면 정상적으로 이미지 파일들의 업로드를 확인할 수 있게 된다. [서비스 등록 기능의 처리] * ProductService는 등록 처리를 위해서 ProductDTO를 Product와 ProductImage 타입의 객체들로 만들어서 처리해야 한다. 이전 예제와 달리 직접 코드를 통해서 DTO를 엔티티 객체로 변환한다. * ProductService 인터페이스에 register() 메서드를 추가한다. package com.unlimited.mall..