IntelliJ 게시판 만들기 (1)

최민영·2024년 9월 12일

IntelliJ

목록 보기
7/30

homecontroller, root-context.xml, servlet-context.xml, web.xml, index.jsp 파일은 앞선 포스팅에서 만든 대로 설정되어 있다
(java 11, tomcat 9.0.93, spring 3)
(계속해서 '코딩레시피' 코드 참고하는 중 _ https://github.com/codingrecipe1/board_framework/tree/main)

1) index.jsp에 '글작성'과 '글목록' 버튼 만들기

<a href="/board/save">글작성</a>
<a href="/board/">글목록</a>

index.jsp의 body 부분에 위의 두 줄을 입력한다

버튼이름

2) boardcontroller 자바 클래스 생성

src > main > java > 설정해둔 패키지 경로 아래에 'boardcontroller' 라는 이름으로 자바 클래스를 생성한다

package com.test.springtest;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequiredArgsConstructor
@RequestMapping("/board")
public class boardcontroller {
    @GetMapping("/save") // /board/save 주소로 들어오면 mapping
    public String saveForm() {
        return "save"; //save 요청을 받으면 save.jsp 파일을 출력
    }
}

'@' 표시를 통해 필요한 패키지를 자동으로 import 할 수 있다
@RequestMapping("/주소1") : /주소1로 들어온 요청을 mapping
@GetMapping("/주소1") : /주소1/주소2로 들어온 요청을 mapping
saveForm() 함수의 return "연결할 jsp 파일" : jsp 파일을 출력

3) save.jsp 파일 생성

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SAVE</title>
</head>
<body>
  <form action="/board/save" method="post">
    <input type="text" name="boardWriter" placeholder="작성자">
    <input type="text" name="boardPass" placeholder="비밀번호">
    <input type="text" name="boardTitle" placeholder="제목">
    <textarea name="boardContents" cols="30" rows="10" placeholder="내용을 입력하세요"></textarea>
    <input type="submit" value="작성">
  </form>
</body>
</html>
: 해당 주소로 들어온 요청에 대한 액션이며 'POST' 업무를 수행 : text 타입으로 입력을 받으며 placeholder로 표기, name에 해당하는 변수명으로 값을 다룰 수 있음 : 긴 문장을 입력받을 때 사용 : value로 표기된 버튼 생성

4) dto 패키지 & 자바 클래스 생성

src > main > java > 설정해둔 패키지 경로 아래에 'dto' 패키지 생성

'dto' 패키지 아래에 'boardDTO' 자바 클래스 생성

package com.test.springtest.dto;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.sql.Timestamp;

@Getter
@Setter
@ToString
public class boardDTO {
    private Long id;
    private String boardWriter;
    private String boardPass;
    private String boardTitle;
    private String boardContents;
    private int boardHits;
    private Timestamp boardCreatedTime; //java.sql.timestamp
}

@Getter / @Setter / @ToString을 import
boardwriter/boardpass/boardtitle/boardcontents : save.jsp에 저장한 변수명대로 사용 -> spring이 Setter를 통해 찾아감
boardCreatedTime : java.sql 패키지를 import

4) repository & service 패키지 & 자바 클래스 생성

src > main > java > 설정해둔 패키지 경로 아래에 'repository'와 'service' 패키지를 생성하고 각 패키지 아래에 'BoardRepository'와 'BoardService' 자바 클래스를 생성한다

5) boardcontroller에 BoardService와 PostMapping 추가

private final BoardService boardService;

BoardService를 이용하기 위해 boardcontroller 클래스에 boardservice를 선언한다

@PostMapping("/save")
    public String save(@ModelAttribute BoardDTO boardDTO) {
        int saveResult = boardService.save(boardDTO);
        if(saveResult > 0) {
            return "redirect:/board/"; //게시판 목록 요청
        } else {
            return "save";
        }
    }

save.jsp에서 "/board/save" 주소로 "post" 해주었을 때 연결되는 함수로, boardDTO에 저장해둔 변수 및 boardService의 내용을 통해 saveResult를 반환한다

글 작성에 성공하면 "/board/" 주소로 연결된다 (글 목록 페이지)

5) BoardService 클래스 구성

package com.test.springtest.service;

import com.test.springtest.dto.BoardDTO;
import com.test.springtest.repository.BoardRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class BoardService {
    private final BoardRepository boardRepository;
    public int save(BoardDTO boardDTO) {
        return boardRepository.save(boardDTO);
    }
}

@Service / @RequiredArgsConstructor를 import
BoardRepository를 import해 'save' 함수가 호출되면 boardRepository.save를 반환한다

6) BoardRepository 클래스 구성

package com.test.springtest.repository;

import com.test.springtest.dto.BoardDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class BoardRepository {
    public int save(BoardDTO boardDTO) {

    }
}

@Repository / @RequiredArgsConstructor를 import

이때 BoardRepository 페이지는 DB와의 연결이 필요하기 때문에 잠시 접어두고 DB를 연동해온다

7) root-context.xml에 DB 정보 구성

mysql 정보를 까먹었어요 ... user이랑 password가 root랑 1015인 줄 알았는데 자꾸 아니래서 비밀번호 잊어버렸을 때 시도하라는 방법 다 시도해봤는데도 창조적인 오류가 떠서 지웠다가 다시 깔아요 ... 이런 정보는 언제나 적어두기 !

mysql db admin 정보 -> user 'db' password '1015'
mysql 테이블 정보 -> user 'root' password '1015'

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 데이터베이스 이름 및 계정 확인 -->
    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/db?useSSL=false&amp;serverTimezone=Asia/Seoul" />
        <property name="username" value="root"/>
        <property name="password" value="1015"/>
    </bean>

    <!-- 현재 프로젝트 패키지 경로 맞는지 확인 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value ="classpath:/mybatis-config.xml" />
        <property name="mapperLocations" value="classpath:/mapper/*.xml" />
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <property name="defaultEncoding" value="UTF-8" />
        <property name="maxUploadSize" value="10000000" />

    </bean>

    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

'데이터베이스 이름 및 계정 확인' 란에 mysql과 관련된 정보를 담아야 한다
"url" 줄의 value를 보면 "jdbc:mysql://localhost:3306/"db admin 이름"?useSSL ~~" 이라고 돼있는데, db admin 이름을 각자 수정해주어야 한다
"username"의 value에는 만들어둔 테이블의 username을 입력하고, "password"의 value에는 만들어둔 테이블의 password를 입력한다

'현재 프로젝트 패키지 경로 맞는지 확인' 란을 보면 인텔리제이에서 "classpath"의 뒤로 빨간 줄이 뜨는 것을 확인할 수 있다
해당 두 줄을의 경로를 설정하기 위해 mapper를 생성한다

8) mapper 디렉토리 만들기

src > main > resources 아래에 'mapper' 디렉토리를 생성한다

mapper 디렉토리 아래에 'boardMapper.xml' 파일을 생성하고 아래의 코드를 입력한다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="Board">
    <insert id="save" parameterType="board">
        insert into board_table(boardWriter, boardPass, boardTitle, boardContents)
        values(#{boardWriter}, #{boardPass}, #{boardTitle}, #{boardContents})
    </insert>
</mapper>

mybatis-config 파일에 'typeAlias'로 설정한 "board"를 사용 (=풀 패키지 경로의 boardDTO를 board라는 이름으로 사용)

insert into ~ (sql 쿼리문 작성) values(#{변수} ~) : 바뀌는 변수에 대해서는 "#{}" 형태로 작성

9) mybatix-config.xml 생성하기

src > main > resources 아래에 'mybatis-config.xml' 파일을 생성하고 아래의 코드를 입력한다

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="com.codingrecipe.board.dto.BoardDTO" alias="board"></typeAlias>
        <typeAlias type="com.codingrecipe.board.dto.CommentDTO" alias="comment"></typeAlias>
    </typeAliases>
</configuration>

boardMapper에서 'typeAlias'로 BoardDTO 경로를 "board"라는 이름으로 사용할 수 있도록 변경해준다

10) BoardRepository 재구성

private final SqlSessionTemplate sql; //자바 클래스와 mapper 간의 연결
    public int save(BoardDTO boardDTO) {
        return sql.insert("Board.save", boardDTO); //mapper에 작성한 namespace에 해당하는 Board, save는 id에 해당
    }

SQL과 관련된 CRUD 작업을 수행하기 위해 SqlSessionTemplate를 import
return sql.insert : sql문의 삽입/저장을 담당
("Board.save", boardDTO) : boardMapper.xml에 mapper의 namespace로 "Board"인 항목을 의미, 해당 namespace에서 id가 "save"인 항목에서 insert 동작 수행, 데이터 삽입에 필요한 정보를 boardDTO에서 가져옴

11) mysql에 필요한 테이블 추가

drop table if exists board_table;
create table board_table(
    id bigint primary key auto_increment,
    boardWriter varchar(50),
    boardPass varchar(20),
    boardTitle varchar(50),
    boardContents varchar(500),
    boardCreatedTime datetime default now(),
    boardHits int default 0,
    fileAttached int default 0
);
drop table if exists board_file_table;
create table board_file_table
(
    id	bigint auto_increment primary key,
    originalFileName varchar(100),
    storedFileName varchar(100),
    boardId bigint,
    constraint fk_board_file foreign key(boardId) references board_table(id) on delete cascade
);
drop table if exists comment_table;
create table comment_table(
    id bigint primary key auto_increment,
    commentWriter varchar(50),
    commentContents varchar(200),
    boardId bigint,
    commentCreatedTime datetime default now(),
    constraint fk_comment_table foreign key (boardId) references board_table(id) on delete cascade
);

여기까지 수행했을 때의 IntelliJ 파일 목록은 다음과 같다

0개의 댓글