본문 바로가기
Spring

[Spring] Spring Framework MVC 커뮤니티 사이트 Tutorial 시작

by BENGGRI 2021. 1. 20.
반응형

 

 

※ eclipse 툴을 이용한 Spring Framework MVC 프로젝트 개발 튜토리얼

※ 커뮤니티 사이트 만들기 튜토리얼

 

1. 학습 목표

  • Spring Framework LifeCycle 이해
  • Spring 설정에 대한 이해
  • SQL Query 기본에 대한 익숙함 증가
  • 코딩 기초에 대한 이해

※ 나도 잘 못하는데 이런 글을 써도 되나 싶다

 

2. 프로젝트 컨셉

  • 커뮤니티 사이트 만들기!

 

3. 구현 범위

  • 사용자 사이트
    • 메인화면
      • 공지사항 목록 조회
      • 공지사항 상세 조회
      • 사용자 알람 표시 
      • 카테고리 별 베스트 게시글 조회
      • 배너 이미지 표시
      • 로그인 페이지 이동 기능
    • 게시글 
      • 게시글 등록
      • 게시글 목록 조회
      • 게시글 상세 조회
      • 게시글 조회수, 추천, 비추천 기능
      • 게시글 수정, 삭제
      • 댓글 영역 - 베스트 댓글 상위 노출
      • 댓글 등록
      • 댓글 계층형 목록 조회
      • 댓글 추천, 비추천 기능
      • 댓글 수정, 삭제
    • 카테고리(메뉴)
      • 카테고리 목록 조회
      • 카테고리 별 게시글 조회
    • 사용자
      • 회원가입
      • 주소 검색 ( 다음, 구글 ... 등 )
      • 회원정보 조회
      • 회원정보 수정
      • 회원 탈퇴
      • 회원 비밀번호 변경
      • 회원 비밀번호 찾기
      • 내 글 보기
      • 내 댓글 보기
      • 사용자 게시글 통계(게시글 별 추천/비추천)
      • 로그인
      • 로그아웃
  • 관리자 사이트
    • 메인화면
      • 공지사항 등록
      • 공지사항 목록 조회
      • 공지사항 상세 조회
      • 공지사항 수정, 삭제
      • 카테고리별 베스트글 조회
      • 베스트글 등록
      • 베스트글 수정, 삭제
      • 배너 이미지 수정
    • 카테고리(메뉴)
      • 카테고리 등록
      • 카테고리 목록 조회
      • 카테고리 상세 조회
      • 카테고리 수정, 삭제
    • 게시글
      • 게시글 목록 조회
      • 게시글 상세 조회
      • 게시글 수정, 삭제
      • 댓글 계층형 목록 조회
      • 댓글 수정, 삭제
    • 사용자
      • 회원가입
      • 회원정보 조회
      • 탈퇴회원 조회
    • 통계
      • 카테고리별 게시글 기간 별 통계(일/월)
      • 사용자 게시글 별 통계(추천/비추천)
      • 사용자 현황 통계
      • 탈퇴 사용자 탈퇴 사유 통계

 

※ 커뮤니티 사이트가 되기 위해서는 많은 기능이 더 필요하지만 스터디를 목적으로 하기 때문에 가장 기본적이고 실무에서 많이 사용하는 기능들로만 구성하였습니다.

 


프로젝트 시작

1. 어디서부터 시작해야 할까?

커뮤니티 사이트를 만들겠다고 하는데 ... 어떤 커뮤니티 사이트인가?

프로젝트 컨셉은 "커뮤니티 사이트 만들기" 입니다.

그렇다면 어떤 성격의 커뮤니티 사이트인지 파악하고 만들려는 커뮤니티 사이트에 꼭 필요한 기능이나 하고싶은 것들을 정리 해야합니다.

( 이 과정을 요구사항 분석이라고 합니다. )

 

사용자가 로그인하고 게시판에 글 쓰고 보고, 댓글도 달고 추천하고 비추천하고 친구도 만들고 싶어요

라는 요청을 받으면, 이 요청을 프로그램 개발을 위해 분리해야합니다.

( 유사한 사이트를 방문해 기능이 어떤 것이 있는지 분석해보는 방법이 가장 좋습니다. )

 

요청 내용을 분리해서 보면

사용자가 로그인하고

이 부분을 자세히 보면

  • 사용자
    • 회원가입
    • 로그인
    • 로그아웃

이렇게 세가지로 분리할 수 있습니다. 그런데

로그인을 하려고 하는데 비밀번호를 까먹으면 어떻게 하지?

비밀번호를 까먹는 일은 자주 있습니다. 이 부분을 추가하고

  • 사용자
    • 회원가입
    • 회원 비밀번호 찾기
    • 로그인
    • 로그아웃
사용자가 현재 가입한 정보를 보고 싶으면 ?
사용자 정보를 변경하고 싶으면 ?
내가 쓴 글이나 댓글을 보고 싶으면 ?
내가 쓴 글이 얼마나 인기 있지?

많은 서비스를 이용할 때 당연히 사용했던 기능들이 하나씩 생각납니다.

  • 사용자
    • 회원가입
    • 주소 검색 ( 다음, 구글 ... 등 )
    • 회원정보 조회
    • 회원정보 수정
    • 회원 탈퇴
    • 회원 비밀번호 변경
    • 회원 비밀번호 찾기
    • 내 글 보기
    • 내 댓글 보기
    • 사용자 게시글 통계(게시글 별 추천/비추천)
    • 로그인
    • 로그아웃

그렇습니다.

사용자가 로그인하고

이 짧은 글 안에 이렇게 많은 기능들이 필요합니다.

물론 위에 적은 기능보다 훨씬 많은 기능이 필요합니다. ( 사용자 프로필 사진, 친구 관리 ... 등 )

 

이번 튜토리얼의 목표는 프로그램을 개발할 때 필요한 마인드를 가지는 것입니다.


2. 일단 코딩부터 시작하기

일단 제 경험을 먼저 말씀 드리면

원래 그림을 그리는 직업을 가지고 있었는데, 
만들고 싶은 서비스가 생겨서 프로그래밍을 배웠습니다.

학원에서 프로그래밍을 배우고 실무 경험을 위해 취업을 하였습니다.

여유 시간이 있을 때마다 집에서 만들고 싶었던 서비스를 만들었습니다.

컨셉은 머리 속에 구름처럼 있던 상황이었고 구체화를 하지 않고 일단 코딩을 시작하였습니다.

코딩부터 시작하니 개발해야할 분량이 가늠이 안되었고,

생각나는대로 코딩을 하다보니 무한히 코딩만 할 뿐이었습니다.

이렇게 하다보니 나중에 생각이 정리되고 프로그램을 개발하기 위해서 준비해야할 것이 무엇인지 알게되었습니다.

 

1. 기능 만들기

1. 게시글 기능 만들기

MySQL Workbench 를 켜서 사용자와 스키마 그리고 테이블을 생성합니다.

※ 먼저 게시글 기능을 만들기 위해 게시판 테이블을 생성한다.

CREATE TABLE `study`.`board` (
  `BOARD_ID` VARCHAR(1000) NOT NULL COMMENT '게시판 ID',
  `TITLE` VARCHAR(50) NOT NULL COMMENT '제목',
  `CONTENT` LONGTEXT NOT NULL COMMENT '내용',
  `USER_ID` VARCHAR(50) NOT NULL COMMENT '사용자 ID',
  `LOOK_CNT` INT NOT NULL DEFAULT 0 COMMENT '조회수',
  `LIKE_CNT` INT NOT NULL DEFAULT 0 COMMENT '추천수',
  `UNLIKE_CNT` INT NOT NULL DEFAULT 0 COMMENT '비추천 수',
  `DISPLAY_YN` VARCHAR(1) NOT NULL DEFAULT 'Y' COMMENT '화면 표시 여부',
  `DEL_YN` VARCHAR(1) NOT NULL DEFAULT 'N' COMMENT '삭제 여부',
  `INSERT_DTS` DATETIME NOT NULL COMMENT '등록일시',
  `UPDATE_DTS` DATETIME NULL COMMENT '수정일시',
  PRIMARY KEY (`BOARD_ID`))
COMMENT = '게시판';

사용자와 스키마 그리고 테이블을 생성하고 나면 이클립스에서 스프링 프로젝트를 생성합니다.

게시글 CRUD 를 위한 Mapper SQL, DAO, Service, Controller 파일을 생성하고 내용을 작성합니다.

 

board_SQL.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="com.study.project_name.BoardDao">

    <select id="getBoardList" resultType="com.study.project_name.BoardVo">
        SELECT 
               BOARD_ID   
             , TITLE      
             , CONTENT    
             , USER_ID    
             , INSERT_DTS 
             , UPDATE_DTS 
             , LOOK_CNT   
             , LIKE_CNT   
             , UNLIKE_CNT 
             , DISPLAY_YN 
             , DEL_YN     
        FROM   STUDY.BOARD
    </select>

</mapper>
BoardDao.java
package com.study.project_name;

import java.util.List;

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDao {

    @Inject
    private SqlSessionFactory sqlSessionFactory;

    public List<BoardVo> getBoardList() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession.selectList( "com.study.project_name.BoardDao.getBoardList" ); 
    }

}
BoardService.java
package com.study.project_name;

import java.util.List;

public interface BoardService {

    public List<BoardVo> getBoardList();

}
BoardServiceImpl.java
package com.study.project_name;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BoardServiceImpl implements BoardService {

    @Autowired
    BoardDao boardDao;

    @Override
    public List<BoardVo> getBoardList() {
        return boardDao.getBoardList();
    }

}
BoardController.java
package com.study.project_name;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BoardController {

    @Autowired
    BoardService boardService;

    @RequestMapping( value="/getBoardList", method=RequestMethod.GET )
    @ResponseBody
    public List getBoardList() {
        return boardService.getBoardList();
    }

}

서버를 기동하고 나니 프로젝트가 정상동작은 하고 있습니다.

2. 이렇게 하는 것이 맞나?

회원 기능을 만들려고 보니 프로젝트의 파일 구조가 너무 이상했습니다.

이런 식으로 파일이 생성되다보니 보기도 불편하고 어떤 파일이 어떤 역할을 하는지 확인이 어려웠습니다.

물론 이런식으로 개발을 진행해도 되지만, 이런 경우 파일이 너무 복잡해지고 보기 어려운 상황이 생기기 때문에 수정이 필요했습니다.

 

패키지 구성은 크게 계층별 구성, 기능별 구성 두가지 유형이 있다고 합니다.

계층별
기능별

패키지 구성을 선택한 후 개발을 다시 진행하려고 하다 보니 이런 질문이 생겼습니다.

지금 개발하고 있는 프로젝트는 어떤 기능이 어떻게 필요하지?

질문을 해결하고 보다 나은 프로그램을 만들기 위해 튜토리얼을 시작하려고 합니다.

 

 

반응형

댓글