Today I Learned
스프링 프로젝트만들기 _ 글과 사진 업로드하기 본문
라이브러리 7개 필요 pom.xml
(파일 관련 라이브러리2개, DB관련 라이브러리 5개)
<!-- MultiPartFile 사용을 위한 라이브러리 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- File Upload를 위한 라이브러리 -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- 필요한 라이브러리는 여기에 추가(maven이 알아서 다운로드 받아준다.) -->
<!-- ojdbc : DB 접속을 도와 준다.-->
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>2.7.2</version>
</dependency>
<!-- dbcp : 커넥션(DB에서 무언가를 할 수 있는 키) 풀 사용 -->
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!--spring-jdbc :DB 연결과 SPRING을 연결 해 준다. -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- mybatis : XML 쿼리문을 특정 인터페이스와 연결해 주는 기능 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- spring-mybatis : 마이바티스와 스프링을 연결해 준다. -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
각 라이브러리에 관련된 설정 해주기(servelet-context.xml & root-context.xml)
디비에버에서 사진파일 관련 테이블 만들기
사진파일이 왜 DB가 필요해 ???
: 사진파일이 어느 게시물에 연결되어 있는지 게시물번호와,(글삭제 했을 경우 파일도 같이 삭제되야함. 어떤글과 연결되어있는지 정보 필요)
사진파일의 번호, (pk필요 콕찝어 수정 및 삭제하려면)
원래 파일명, (다운로드 받을 때 원래이름으로 저장할 수 있어야 한다)
바뀐 파일명 (원래이름은 이건데 지금은 이이름으로 저장되어있어! )
에 대한 정보가 필요하다.
-> 이정보를 dto에 담음 (photoDTO) - 테이블의 컬럼명과 dto의 변수명과 파라메터 이름 이 세가지를 같게하기!!
- 부모테이블 존재해야함 (게시글에 파일 업로드하니까)
idx를 외래키로
- 연계 참조 무결성 제약조건 on delete cascade 자식먼저 지우고 부모지워라
부모의 데이터는 자식이 있는 상태에서는 지워질 수 없다 왜> 부모의 기본키를 자식이 가져다가 사용하고 있으니까
(그니까 글을 삭제하면 파일도 지워지게/ 글 삭제가 가능하도록 )
enctype="multipart/form-data"
- 파라메터에 바이너리데이터와 텍스트 데이터가 있으니 form태그에 꼭 enctype 속성 써주기 !
service에서 페이지 이동하기
: 페이지이동을 controller에서 안하고 service에 맡길수도있음
*게시물 과 사진 업로드 시 체크해야 하는 부분*
- writeForm의 subject,user_name,content 파라메터(params)는 bbs db로 가야하고 , 사진 파일(photos) 은 photo db로 가야한다.
- 게시물 글쓰기를 하고 게시물의 번호(idx) 를 알아서 photo 와 연결해야한다 (부모 - 자식) / 삭제 및 수정을 위해서
: 방금 insert한 글 게시글의 번호는 이거야 그걸 photo db에 줌
(게시글 쓰고 bbs의 최신번호를 가져오면 되지않을까? 그사이에 다른사람이 넣을 수 있어 꼬일 수 있음)
<방금 insert한 게시글의 번호 알아내는 법>
1.bbs에 데이터 입력
2.bbs 입력 후 방금 입력한 데이터에 대한 idx 얻어오기
2번을 하기 위한 조건
1. 파라메터는 반드시 DTO로 할 것
- BoardDTO 객체 생성
- 파라메터 에서 가져온 값(hashmap으로 가져온 params)을 get메서드에서 가져오고, 세터를 통해서 dto에 넣는다
- insert 가 끝나면 파라메터에 idx 가 들어있을 것이다 (getIdx() 를 통해 확인 가능 )
2. mapper에서 insert할 때 옵션 사용
- 세가지 옵션 사용 (만들어진 키를 사용할거고, 어떤 컬럼을 가져올래?, Dto의 어떤 변수에 담을래?)
- useGeneratedKeys 라는 옵션을 사용할 것
- useGeneratedKeys="true" : 만들어진 키를 사용하겠다
- keyColumn="idx" : 어떤 컬럼을 가져올래? (bbs테이블에 insert하잖아 insert하고 어떤 컬럼을 가져올거냐고 물어보는건가봐)
- keyProperty="idx" : DTO 의 어떤 변수(필드,속성)에 담을래? (service에서 파라메터를 dto로 만들었잖아 저기 parametertype dto 풀경로 써있고. 그파라메터에 어떤 변수에 담을거냐고 물어보는듯! 이 옵션을 사용하려고 파라메터를 dto에 담나봐)
+ bbs컬럼명하고 파라메터이름하고 dto속성이름을 통일시킴
+ 객체의 변수를 속성이라고도 한다
- 2가지 조건을 만족후 insert를 하게되면 dto 파라메터에 idx가 들어있을 것이다.
- getIdx 메서드를 통해서 idx 변수에 넣어주기
- 글쓰기가 성공했을 경우 파일도 저장해줄 것이다. 이때 인자값으로,사진과 얻어낸 idx 2개를 넣어줘야 한다.
- fileSave 메서드 인자값은 사진파라메터와 글쓰기 메서드에서 얻어낸 글번호(idx) 2개를 넣어주기!
- 파일 업로드 순서 3가지를 끝낸 후, 꼭 photo 테이블에 데이터를 insert해주는 과정을 잊지 말아야한다.
글쓰기 코드 작성 후 실행할 때 (여러가지 경우 고려하면서 테스트하기)
- 사진 없이 글만 저장 테스트
- 잘 됐다면 사진까지 업로드 해서 저장해보기
- upload파일에 잘 저장됐는지 확인하기
<에러>
mapper에 namespace 에 dao 복붙 잘못했을 때 서버실행하니 뷰 안보이고 뜬 에러
'Spring Framework' 카테고리의 다른 글
Spring Framework_ Ajax 로 로그인,회원가입 구현하기 (0) | 2022.05.30 |
---|---|
Ajax_html 가져오기 (0) | 2022.05.30 |
Spring Framework_ 에러 발생시 특정 controller 요청으로 보내는 설정 (0) | 2022.05.28 |
Ajax_비동기 방식 (0) | 2022.05.28 |
Spring Framework - 파일 업로드,다운로드 (0) | 2022.05.27 |