Spring/[Spring]Board(기본 게시판)

스프링 게시판 만들기 - 4(글 업로드)

Ms.Pudding 2022. 1. 15. 00:13

 

1.controller

파일이랑 게시판 업로드 화면을 받는 controller를 만들어보자 

@Controller
@AllArgsConstructor

public class BoardController{

	private final BoardService boardService;
    
    //단순 화면 보여주기
    @GetMapping("/board/list")
    public ModelAndView getList(){
    	ModelAndView view = new ModelAndView();
        view.setViewName("views/board/board_list");
        return view;
    }
    
    //게시판 등록페이지
    @GetMapping("/board/register")
    public ModelAndView registerView(){
    	ModelAndView view = new ModelAndView();
        view.setViewName("views/board/register");
    	return view;
    }
    
    //게시판 등록 psot
    @("/board/register/add")
    public MoadelAndView register(@ModelAttribute BoardVO.request request){
    	ModelAndView view = new ModelAndView();
        try{
        	boardService.register(request);
        }catch(Exception e){
        	e.printStackTrace();
        }
        view.setViewName("views/board/board_list");
        return view;
    
    }
    
}

@ModelAttribute 객체를 받아오며, 게시판 등록 post부분에 BoardVO.request 객체를 받아온다! 

 

 

2.mapper쿼리 등록 

<insert id="insertBoard" parameterType="com.board.web.vo.board.BoardVO$Request">

 insert into board(title,content,writer,origin_file_name,stored_file_name)
        values(#{title},#{content},#{writer},#{originFileName},#{storedFileName})
  

</insert>

윗칸이 db에 쓰는 형식으로 쓰고 #{}로 셀렉트 된 부분은 자바형식으로 쓴다

 

3. 자바 mapper 

//게시판 전체 게시글 수 가져오기 (페이징 시 필요)
public int getListCount() throws Exception;

//게시판 등록하기
public int insertBoard(BoardVO.Request request) throws Exception;

 

4.service

 

@Service
public class BoardService{

	private BoardMapper mapper;
	
	@Value("${propertiy 주소}")
	private String filePath;

	public BoardService(BoardMapper mapper){
		this.mapper = mapper;
	}

	//전체 게시글 수 
	public int getListCount() throws Exception{
		return this.mapper.getListCount();
	}

	//게시글 등록 
	public int register(BoardVO.Request request) throws Exception{



	//파일 업로드 실행 부분 
	MultipartFile file = request.getFile();
	//원본 파일 저장변수
	String originFileName ="";
	//확장자 저장 변수
	String exe ="";
	//저장 파일 이름
 	String storedFileName = "";

	//파일 객체를 넘겨 준 후, 업로드 시작 
	
	if(!file.isEmpty()){

		//원본 파일 이름을 저장
		originFileName = file.getOriginalFileName();

		//파일 확장자만 추출
		exe = originFileName.subString(originFileName.lastIndexOf(".")+1)

		//파일 저장 이름
		storedFileName = "file_" + nowTime +"."+exe;

		//파일 저장 경로
		String fullPath = filePath+storedFileName;
		
		//파일 객체를 생성
 		File newFile = new File(fullPath);
	}

	//파일이나 경로가 존재하지 않는 경우
	
	if(!newFile.exists()){
		//저장 디렉토리 만들기
		newFile.getParentFile().mkdirs();
		//파일 복사할 내용이 없는 파일을 만든다.
		newFile.createNewFile();

	}
	
	// 빈 파일에 원본을 복사하여 담는다
	file.transferTo(newFile);
	request.setOriginFileName(originFileName);
	request.setStoredFileName(storedFileName);

	return mapper.insertBoard(request);

	}


}

1.@AllArgsContstuctor를 쓰지 않았다. 왜냐하면 filePath는 주소를 가지고 있는 변수인데, 여기서 주소가 변동될 수도 있기 때문에 mapper 생성자는 따로 써줬다.

 

2.업로드 실행순서 

-1. MultiPartFile 객체를 만든다. 여기에 파일을 저장할 것이다. 

-2. 원본 파일 이름, 확장자, 저장 파일 이름을 구분 짓는다.

-3. 저장경로를 설정한다. 이때 저장경로는 filePath 즉, 내 로컬파일에 있는 주소와 저장된 파일 이름을 가지고 있다.

-4. 이 저장경로를 가지고 있는 파일 객체를 만든다.

-5. 이제 MultipartFile 객체에 파일을 복사하여 담는다 

 

3.originFileName.lastIndexOf(".")+1 

확장자를 추출하는 과정인데 +1을 안하면 .을 포함한 뒷 부분 전체를 가르킨다.

+1을 했으니 .을 포함하지 않는 뒷부분을 가르키며 

이를 subString으로 감싸주었으니 그 부분만 추출하여 확장자를 확인한다.