Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Today I Learned

스프링 프로젝트만들기 _ 글과 사진 업로드하기 본문

Spring Framework

스프링 프로젝트만들기 _ 글과 사진 업로드하기

꾸주니12 2022. 5. 28. 19:11

라이브러리 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"

writeForm.jsp

- 파라메터에 바이너리데이터와 텍스트 데이터가 있으니 form태그에 꼭 enctype 속성 써주기 !

 

 

 

 

service에서 페이지 이동하기

homecontroller

: 페이지이동을 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 복붙 잘못했을 때 서버실행하니 뷰 안보이고 뜬 에러