본문 바로가기
Back-End/Spring Boot

Spring Boot - 상품 등록하기

by 코젼 2022. 7. 27.
728x90
반응형

2022-07-27(28일차)


💁‍♀️상품 등록할 때 유의할 점을 알아봅시다.

◾ 만약 상품 테이블에 모든 정보를 넣는다면? 상품 테이블 안에 이름, 가격, 제조회사, 상세설명, 이미지... 등 정보들이 다 들어간다.
 --> 정보들을 하나의 테이블에 다 넣게 되면 테이블 하나가 너무 커져버린다.
결론 : 상품 테이블에 모든 정보를 모은다는 것은 무모한 짓이므로 정규화를 진행한다.

◾ 테이블을 나누고, 아이템, 상품 정보, 상품하고 관련있는 이미지는 아이템 이미지 테이블로 분리한다.
◾ 상품 테이블은 이미지가 여러개 있을 수 있기 때문에 일대 다 형태로 테이블을 생성한다.

◾ join하게 되면 오히려 테이블이 커져버리기 때문에 처리하기 힘들다.
 --> 만약 테이블 1이 100개이고, 테이블 2가 1000개이면, 100*1000정보가 돼서 너무 많아진다.


🔸관계형 db
◾ 테이블을 엑셀 모양으로 설계하고 데이터가 들어간다.
◾ 1행, 2행이 들어있으면 select *을하면 모든 컬럼 순서대로 (엑셀 모양)으로 나온다.
 --> 그러나 구조대로 쌓이는 것은 아니다.
◾ 내부적으로 1행에 데이터 A, B, C가 들어있다면, A를 가져왔을 때 B를, B를 가져왔을 때 C를 가져올 수 있도록 한다.
A B C

🔸컬럼 db
부가적인 정보는 필요없고 하나의 컬럼만 가져오고 싶다면, 컬럼 단위로 가져온다.
◾ 대용량 db에 유용하다.
◾ 특정 컬럼만 읽는 경우 아주 빠르다.


◾ 상품테이블, 이미지 테이블로 나눈다.
◾ 배열, 리스트, 해쉬맵, 셋, 임의로 내가 만든 클래스들은 모두 객체이다.

🔸modelmapper 라이브러리
◾ 만약 공통된 데이터가 있더라도 두 데이터가 연결되기 때문에, 두 테이블에 공통된 데이터를 둘다 넣어야 하는 상황이 생기는 불편함이 생긴다.
◾ 이를 해결하기 위해 같은 이름이면 알아서 세팅해달라고 요청하는 modelmapper 라이브러리를 가져온다.
◾ 그러나 jpa를 사용하지 않을 것이라면 사용할 일이 없기 때문에 modelmapper 라이브러리를 가져오지 않아도 된다.

💁‍♀️상품 등록하는 페이지로 이동해봅시다.

◾ admin/item/new 안의 Controller 자바 파일

ItemControllder안에 있을 것이다. -- java 파일


🔸Mapping 방식
◾ get은 주소를 입력할 수 있다.
◾ post는 버튼 입력했을 때 페이지로 연결된다.


💁‍♀️아무것도 입력하지 않은 빈페이지일텐데 ItemFormDto를 new를 해서 모델을 실은 이유는?

◾ 상품 등록을 하게 하면 그 페이지를 다시 볼 일은 없기 때문에, 페이지에서는 한 번 보내고 자신의 역할이 끝났으면 입력한 값만 보내면 된다.
◾ 다시 볼 일은 입력을 잘못했을 때이다. 다시 되돌아오거나 값을 가지고 왔을 때 화면의 값을 보여주라고 요청한다.
◾ 화면에서는 처음 들어오든지 다시 들어오든지 내용이 있다면 보여줄 것이고 없으면 없는대로 빈칸 표시해야 하기 때문에, 보여줄 수 있는 가능성이 있어서 빈 것을 만들어준다.
◾ 빈 페이지를 만들게 된다면 나중에 다시 들어오더라도 문제가 생기지 않는다.

◾ 만약 다 비워놨는데 ItemFormDto값을 보여주는게 있다면 없는 것을 보여주라고 요청하기 때문에 에러가 날 것이다.


💡MultiPartFile

◾ MultiPartFile 형식으로 받아야지 Spring에서 처리할 수 있다.
◾ MultiPartFile은 클래스이다.
◾ 이 안에 originalname, filesize, 정보 뿐만 아니라 실제 파일 내역, 엑셀, 텍스트, 이미지 파일이든 메타 정보들과
원본 크기, 사이즈, 실제 파일 내용이 모두 다 들어가있다.

◾ 파일을 한꺼번에 여러 개를 전송을 했다면 그것을 리스트 형식으로 받고, MultiPartFile이라는 하나의 이름으로 받는다.
◾ 전송할 때는 itemImgFile이라고 보내는데 내부적으로는 인덱스가 모두 들어있다. [0], [1], [2]... 인덱스를 붙여서 사용한다.
◾ 리스트로 요청하는지 개수가 몇 개인지 알고 요청하는 것이 아니라 이름만 가지고 요청하더라도 실제로는 여러개의 값이 들어온다.
◾ 한 개 한 개의 값을 받을 때는 MultiPartFile로 가져온다.

💡 UUID

◾ 파일을 올려서 사용자에게 파일을 작성하고 재전송하라고 부탁했을 때, 같은 이름의 파일이 무수히 올라올 수있다.
 --> 같은 파일이 너무 많기 때문에 서버에서 잘 받아서 db까지 잘 넘겨서 저장을 잘 하더라도 문제가 발생한다.
◾ 사용자가 같은 이름의 파일을 올리거나, 복잡하게 올리더라도 개발자가 알아서 잘 저장해야한다.

◾ 이를 해결하기 위해, 자바 7, 8이 되면서 UUID가 생겼다.
접속한 컴퓨터의 초 단위까지 해서 굉장한 복잡한 수를 겹치지 않게 자동으로 만들어준다.
◾ 실제로 서버에 저장할 때 겹치지 않게 UUID가 생긴다.
◾ UUID가 워낙 유일하다 보니 이것을 id값으로 사용한다.
대부분의 구조에서 첨부파일이 들어가면,

쉽게 핸들링할 수 있는 id, 
실질적인 이름 UUID, 
오리지널 이름은 MultiPartFile안에서 메타정보를 통해 가져온다.

💡 첨부파일 요점

1. 첨부파일 보낸 건 MultiPartFile로 관리해야한다.
 --> 리스트든, 단일파일이든 각종 정보가 다 있다.
 --> .method로 해서 들어가면 메타정보들이 다 나온다. 객체까지도!
2. 화면에서 보여준 것은 여러개이더라도, 하나의 이름으로 요청하고 내부적으로 처리할 때만 List처럼 처리한다.
3. UUID의 실제 이름은 중복 방지 때문에 이상한 코드로 들어가있다. -- 중복 X
🔸 UUID 형식
UUID uuid = UUID.randomUUID();​
728x90
반응형

댓글