본문 바로가기

프로젝트 개발기/Status 200 ( Team Project )

10. TEAM 프로젝트: 캘린더 기능 구현 - 그룹 (2)


상세한 개발 내역을 작성할려고 했으나, 여러 번의 디버그가 있었고 개발 단계에서 변경되는 점 또한 많았다. 

때문에 완성된 캘린더를 기능 별로 정리하고, 개선점을 작성하려고 한다. 

(TimeLine에 작성해 봤으나 글이 한눈에 들어오지 않는다는 단점이 있어서 방법을 바꿨다.)

 


그룹 및 To Do List 에서의 기본 기능은 스케줄과 유사하다. 

결국 프로그램은 DB에 어떻게 데이터를 넣고, 꺼내고, 보여주냐의 차이이기 때문에 각각의 기능은 사실상 레이아웃의 기능 차이나 유저 편의성의 적용 차이이다.

때문에 각각의 코드에 주석을 달기보다는 동일한 동작은 코드만 게시하는 방식으로 정리하려 한다.

 

1. Servlet 및 AJAX

1) 기본 설정 

// Group 대한 XmlHttpRequest
var XHRGroup;
function createXHRGroup(){
    if(window.ActiveXObject){ 
        XHRGroup=new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if(window.XMLHttpRequest){
        XHRGroup=new XMLHttpRequest();
    }
}

 

2) 그룹 추가 

 

a. DAO 

public void groupInsert(GroupDTO gDTO){

    String sql="insert into groupData (groupname, groupcolor, searchable, master) values(?,?,?,?)";
    Connection conn=null;
    PreparedStatement pstmt=null;
    ResultSet rs=null;

    try{
        conn=getConnection();
        pstmt=conn.prepareStatement(sql);
        pstmt.setString(1, gDTO.getGroupname());
        pstmt.setString(2, gDTO.getGroupcolor());
        pstmt.setString(3, gDTO.getSearchable());
        pstmt.setString(4, gDTO.getMaster());

        System.out.println(pstmt);
        pstmt.executeUpdate();
        pstmt.clearParameters();

        sql = "select groupnum from groupData where master = ? order by groupnum asc";
        pstmt=conn.prepareStatement(sql);
        pstmt.setString(1, gDTO.getMaster());
        System.out.println(pstmt);
        rs = pstmt.executeQuery();

        while(rs.next()) {
            gDTO.setGroupnum(rs.getString("groupnum"));
        }
        pstmt.clearParameters();

        sql = "insert into groupMember(groupnum, id, invite) values(?,?,?)";
        pstmt=conn.prepareStatement(sql);
        pstmt.setString(1, gDTO.getGroupnum());
        pstmt.setString(2, gDTO.getMaster());
        pstmt.setString(3, "accept");
        System.out.println(pstmt);
        pstmt.executeUpdate();
        pstmt.clearParameters();

        sql = "insert into groupModifier(groupnum, id) values (?,?)";
        pstmt=conn.prepareStatement(sql);
        pstmt.setString(1, gDTO.getGroupnum());
        pstmt.setString(2, gDTO.getMaster());
        System.out.println(pstmt);
        pstmt.executeUpdate();
        pstmt.clearParameters();
    }
    catch(Exception e)
    {
        System.out.println("GroupDAO> groupData Insert Error: "+e);
    }
    finally
    {
        close(conn, pstmt);
    }
}

public void groupUpdate(GroupDTO gDTO){
    String sql="update groupData set groupname=?, groupcolor=?, searchable=? where groupnum=?";

    Connection conn = null;
    PreparedStatement pstmt = null;

    try{
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);

        pstmt.setString(1, gDTO.getGroupname());
        pstmt.setString(2, gDTO.getGroupcolor());
        pstmt.setString(3, gDTO.getSearchable());
        pstmt.setString(4, gDTO.getGroupnum());

        pstmt.executeUpdate();
    }
    catch(Exception e){
        System.out.println("ScheduleDAO > groupData UPDATE Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

 

b. Servlet 

package ServletCalendar;

import java.io.BufferedReader;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import DAO.GroupDAO;
import DTO.GroupDTO;
import DTO.MemberDTO;

@WebServlet("/groupInsert")
public class groupInsert extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		request.setCharacterEncoding("utf-8");
		
		String json = readJSON(request);
		JSONObject data = objJSON(json);
		
		String id = String.valueOf(data.get("userKey"));
		String num = String.valueOf(data.get("num"));
		String name=String.valueOf(data.get("name"));
		String color=String.valueOf(data.get("color"));
		String master=String.valueOf(data.get("master"));
		String searchable=String.valueOf(data.get("searchable"));


		master = master.replace("\"", "");
		master = master.replace("\'", "");
		
		GroupDTO gDTO = new GroupDTO();
		MemberDTO mDTO = new MemberDTO();
		
		mDTO.setId(id);
		gDTO.setGroupnum(num);
		gDTO.setGroupname(name);
		gDTO.setGroupcolor(color);
		gDTO.setMaster(master);
		gDTO.setSearchable(searchable);
		
		if(gDTO.getMaster().equals("")||gDTO.getMaster().equals("null")||gDTO.getMaster()==null) {
			gDTO.setMaster(mDTO.getId());
		}
		
		if(gDTO.getMaster().equals("")) {
			gDTO.setMaster(mDTO.getId());
		}
		else {
			gDTO.setMaster(gDTO.getMaster());
		}
		
		// DTO 생성시 수정 필요 
		
		GroupDAO gDAO = GroupDAO.getInstance();
		// 그룹 넘버가 "" 라면 지금 막 추가한 데이터 므로 인설트
		// 넘버가 있다면 수정이므로 업데이트  
		if(gDTO.getGroupnum().equals("")){
			if((mDTO.getId()).equals(gDTO.getMaster())) {
				System.out.println("인설트");
				gDAO.groupInsert(gDTO);
			}
		}
		else{
			if((mDTO.getId()).equals(gDTO.getMaster())) {
				System.out.print("업뎃");
				gDAO.groupUpdate(gDTO);
			}
		}
	}

	protected String readJSON(HttpServletRequest request) { 
		StringBuffer json = new StringBuffer(); 
		String line = null;
		
		try { 
			BufferedReader reader=request.getReader();

			while((line=reader.readLine())!=null){ 
				json.append(line); 
			}
		}
		catch(Exception e) {
			System.out.println("JSON 파일을 읽어오던 중 오류 발생");
		}
		return json.toString(); 
	}
	
	protected JSONObject objJSON(String str) {
		Object obj=null;
		JSONObject json=null;
		System.out.println(str);
		try {
			JSONParser parser = new JSONParser();
			obj=parser.parse(str);
			json=(JSONObject)obj;
		}
		catch(Exception e) {
			System.out.println("JSON 변환 중 오류 발생: "+e);
		}
		return json;
	}
}

 

c. AJAX 

// 그룹 추가 폼에서 완료버튼 누를시 데이터를 전송함 
// AJAX로 처리
function addGroup(date){
    createXHRGroup();

    let target = event.target;
    let v = target.parentNode;
    let p = v.parentNode;
    let flag = document.getElementsByClassName("groupAddFlag")[0];
    let button = p.parentNode.getElementsByClassName("groupAdd")[0];

    if(flag.value=="true"){
        flag.setAttribute("value", "false");
        button.classList.remove("Xbutton");
    }
    let num = v.getElementsByClassName("groupDataNum")[0].value;
    let name = v.parentNode.getElementsByClassName("groupDataName")[0].value;
    let memberlist = v.getElementsByClassName("groupDataMemebersListName");
    let modifierlist = v.getElementsByClassName("groupDataModifierList");
    let color = v.getElementsByClassName("groupDataColor")[0].value;
    let master = v.getElementsByClassName("groupDataMaster")[0].value;
    let searchable = v.getElementsByClassName("groupDataSearchable")[0].value;

    let members=[];
    let modifiers=[];

    if(typeof(memberlist)=='undefined'){
        members.push("");
    }
    else{
        for(let i = 0; i < memberlist.length; i++){
            let str = memberlist[i].innerHTML.replace(")", "");
            str = str.split("(");
            members.push(str[1]);
        }
    }

    if(typeof(modifierlist)=='undefined'){
        modifiers.push("");
    }
    else{
        for(let i = 0; i < modifierlist.length; i++){
            let str = modifierlist[i].innerHTML.replace(")", "");
            str = str.split("(");
            modifiers.push(str[1]);
        }
    }

    let json = JSON.stringify(createJsonGroup(userKey, num, name, members, modifiers, color, master, searchable));

    if(typeof(date)=="undefined"){
        let input = document.getElementsByClassName("calendarHeadDateInfo")[0];
        let inputYear = parseInt(input.value.substring(0,4));
        let inputMonth = parseInt(input.value.substring(4,6));
        let inputDay = parseInt(input.value.substring(6,8));

        date = getThisDay(inputYear, inputMonth, inputDay, 0, 0)
    }

    XHRGroup.onreadystatechange=function(){
        if(XHRGroup.readyState==4){
            if(XHRGroup.status==200){
                getGroupSchedule(userKey, date);
            }
        }
    }
    XHRGroup.open("POST", "groupInsert", true);
    XHRGroup.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRGroup.send(json);
}​

 

3) 그룹 삭제

 

a. DAO 

// 그룹 삭제 
public void groupDelete(GroupDTO gDTO)
{
    String sql ="delete from data, member, modifier, sc using groupdata data inner join groupmember member inner join groupmodifier modifier inner join schedule sc where data.groupnum = member.groupnum and member.groupnum = modifier.groupnum and data.groupnum = sc.groupnum and data.groupnum = ?";

    Connection conn = null;
    PreparedStatement pstmt = null;
    // 그룹 삭제에 대한 알고리즘은 서블렛에 구현 

    try
    {
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gDTO.getGroupnum());
        System.out.println(pstmt);
        pstmt.executeUpdate();

    }
    catch(Exception e){
        System.out.println("ScheduleDAO> groupData Delete Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

 

b. Servlet 

package ServletCalendar;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import DAO.GroupDAO;
import DTO.GroupDTO;
import DTO.GroupMemberDTO;
import DTO.GroupModifierDTO;
import DTO.MemberDTO;

@WebServlet("/groupDelete")
public class groupDelete extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		// JSON 으로 데이터를 주고 받음 
		String json = readJSON(request);
		JSONObject data = objJSON(json);

		String id = String.valueOf(data.get("userKey"));
		String num = String.valueOf(data.get("num"));
		String members = String.valueOf(data.get("members"));
		String master=String.valueOf(data.get("master"));
		
		// 마스터는 해당 그룹의 권한자로, 그룹 생성자로 한정 
		master = master.replace("\"", "");
		master = master.replace("\'", "");
		
		String str = members.replace("[", "");
		str = str.replace("]", "");
		str = str.replace("\'", "");
		str = str.replace("\"", "");
		String[] arr = str.split(",");
		System.out.println(arr.length);
		
		GroupDTO gDTO = new GroupDTO();
		MemberDTO mDTO = new MemberDTO();
		GroupMemberDTO gmDTO = new GroupMemberDTO();
		GroupModifierDTO gdDTO = new GroupModifierDTO();
		
		mDTO.setId(id);
		gDTO.setGroupnum(num);
		gDTO.setMaster(master);
		
		gmDTO.setId(id);
		gmDTO.setGroupnum(num);
		
		gdDTO.setId(id);
		gdDTO.setGroupnum(num);
		
		GroupDAO gDAO = GroupDAO.getInstance();
		
		// 마스터랑 유저키가 같고 그룹 멤버가 자신 혼자라면 삭제함 
		// 마스터가 아니면 자신만 해당 그룹에서 빠지는 형태 
		if(gDTO.getMaster().equals(mDTO.getId())) {
			if(arr.length==1) {
				gDAO.groupDelete(gDTO);
				gDAO.deleteMember(gmDTO);
				gDAO.deleteModifier(gdDTO);
			}
		}
		else {
			gDAO.deleteMember(gmDTO);
			gDAO.deleteModifier(gdDTO);
		}
	}

	protected String readJSON(HttpServletRequest request) { 
		StringBuffer json = new StringBuffer(); 
		String line = null;
		
		try { 
			BufferedReader reader=request.getReader();

			while((line=reader.readLine())!=null){ 
				json.append(line); 
			}
		}
		catch(Exception e) {
			System.out.println("JSON 파일을 읽어오던 중 오류 발생");
		}
		return json.toString(); 
	}
	
	protected JSONObject objJSON(String str) {
		Object obj=null;
		JSONObject json=null;
		System.out.println(str);
		try {
			JSONParser parser = new JSONParser();
			obj=parser.parse(str);
			json=(JSONObject)obj;
		}
		catch(Exception e) {
			System.out.println("JSON 변환 중 오류 발생: "+e);
		}
		return json;
	}
}

 

c. AJAX 

// 그룹을 삭제하는 기능 
// 매개변수는 추후 date를 따른 스케줄 폼 생성을 위해 넣음 
function delGroup(date){
    // 검증식 넣어 마스터와 유저키가 일치할 경우: 그룹 삭제
    // 우선 서버에서 검증하게 함
    createXHRGroup();

    let target = event.target;
    let v = target.parentNode;

    let num = v.getElementsByClassName("groupDataNum")[0].value;
    let name = v.parentNode.getElementsByClassName("groupDataName")[0].value;
    let memberlist = v.getElementsByClassName("groupDataMemebersListName");
    let modifierlist = v.getElementsByClassName("groupDataModifierList");
    let color = v.getElementsByClassName("groupDataColor")[0].value;
    let master = v.getElementsByClassName("gㅁroupDataMaster")[0].value;
    let searchable = v.getElementsByClassName("groupDataSearchable")[0].value;

    let members=[];
    let modifiers=[];

    if(typeof(memberlist)=='undefined'){
        members.push("");
    }
    else{
        for(let i = 0; i < memberlist.length; i++){
            let str = memberlist[i].innerHTML.replace(")", "");
            str = str.split("(");
            members.push(str[1]);
        }
    }

    if(typeof(modifierlist)=='undefined'){
        modifiers.push("");
    }
    else{
        for(let i = 0; i < modifierlist.length; i++){
            let str = modifierlist[i].innerHTML.replace(")", "");
            str = str.split("(");
            modifiers.push(str[1]);
        }
    }

    let json = JSON.stringify(createJsonGroup(userKey, num, name, members, modifiers, color, master, searchable));

    if(typeof(date)=="undefined"){
        let input = document.getElementsByClassName("calendarHeadDateInfo")[0];
        let inputYear = parseInt(input.value.substring(0,4));
        let inputMonth = parseInt(input.value.substring(4,6));
        let inputDay = parseInt(input.value.substring(6,8));

        date = getThisDay(inputYear, inputMonth, inputDay, 0, 0)
    }

    XHRGroup.onreadystatechange=function(){

        if(XHRGroup.readyState==4){
            if(XHRGroup.status==200){
                getGroupSchedule(userKey, date);
            }
        }
    }
    XHRGroup.open("POST", "groupDelete", true);
    XHRGroup.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRGroup.send(json);
}

 

4) 그룹 - 스케줄 수정자 관련 

 

a. DAO 

public void insertModifier(GroupModifierDTO gdDTO){

    String sql="insert into groupmodifier(groupnum, id) value (?,?)";

    Connection conn = null;
    PreparedStatement pstmt = null;

    try{
        conn = getConnection();

        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gdDTO.getGroupnum());
        pstmt.setString(2, gdDTO.getId());
        System.out.println(pstmt);
        pstmt.executeUpdate();
    }
    catch(Exception e){
        System.out.println("ScheduleDAO > groupData UPDATE Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

public void deleteModifier(GroupModifierDTO gdDTO){

    String sql="select num, id, groupnum from groupmodifier where id = ? and groupnum = ?";

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try{
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gdDTO.getId());
        pstmt.setString(2, gdDTO.getGroupnum());
        System.out.println(pstmt);
        rs = pstmt.executeQuery();

        while(rs.next()) {
            gdDTO.setNum(rs.getString("num"));
        }
        pstmt.clearParameters();

        sql="delete from groupmodifier where num = ?";
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gdDTO.getNum());
        System.out.println(pstmt);
        pstmt.executeUpdate();
    }
    catch(Exception e){
        System.out.println("ScheduleDAO > groupData UPDATE Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

 

b. Servlet 

package ServletCalendar;

import java.io.BufferedReader;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import DAO.GroupDAO;
import DTO.GroupDTO;
import DTO.GroupModifierDTO;
import DTO.MemberDTO;


@WebServlet("/groupModifier")
public class groupModifier extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		String json = readJSON(request);
		JSONObject data = objJSON(json);
		
		String id = String.valueOf(data.get("userKey"));
		String num = String.valueOf(data.get("num"));
		String target = String.valueOf(data.get("target"));
		String modifiers=String.valueOf(data.get("modifiers"));
		String master=String.valueOf(data.get("master"));

		GroupDTO gDTO = new GroupDTO();
		MemberDTO mDTO = new MemberDTO();
		GroupModifierDTO gdDTO = new GroupModifierDTO();
		
		master = master.replace("\"", "");
		master = master.replace("\'", "");

		gdDTO.setId(target);
		gdDTO.setGroupnum(num);
		
		mDTO.setId(id);
		gDTO.setGroupnum(num);
		gDTO.setMaster(master);

		String str = modifiers.replace("[", "");
		str = str.replace("]", "");
		str = str.replace("\"", "");
		str = str.replace("\'", "");
		String[] arr = str.split(",");
		
		str = "";
		boolean flag=true;
		
		for(int i = 0; i<arr.length; i++) {
			if(arr[i].equals(gdDTO.getId())) {
				flag = false;
			}
		}
		
		GroupDAO gDAO = GroupDAO.getInstance();
		
		if(mDTO.getId().equals(gDTO.getMaster())) {
			if(flag==true) {
				gDAO.insertModifier(gdDTO);
			}
			else {
				gDAO.deleteModifier(gdDTO);
			}
		}
	}

	protected String readJSON(HttpServletRequest request) { 
		StringBuffer json = new StringBuffer(); 
		String line = null;
		
		try { 
			BufferedReader reader=request.getReader();

			while((line=reader.readLine())!=null){ 
				json.append(line); 
			}
		}
		catch(Exception e) {
			System.out.println("JSON 파일을 읽어오던 중 오류 발생");
		}
		return json.toString(); 
	}
	
	protected JSONObject objJSON(String str) {
		Object obj=null;
		JSONObject json=null;
		System.out.println(str);
		try {
			JSONParser parser = new JSONParser();
			obj=parser.parse(str);
			json=(JSONObject)obj;
		}
		catch(Exception e) {
			System.out.println("JSON 변환 중 오류 발생: "+e);
		}
		return json;
	}
}

 

c. AJAX 

// Group 구성원에게 수정자 권한을 조정함
// 수정자가 이미 부여시 철회
// 수정자가 안부여되면 부여함
function groupDataModifierFix (){
    createXHRGroup();

    let target = event.target;
    let v = target.parentNode
    let p = v.parentNode;
    let t = p.getElementsByClassName("groupDataMemebersListInputId")[0].value;
    let gp = p.parentNode.parentNode;
    let num = gp.getElementsByClassName("groupDataNum")[0].value;
    let name = gp.parentNode.getElementsByClassName("groupDataName")[0].value;
    let memberlist = gp.getElementsByClassName("groupDataMemebersListName");
    let modifierlist = gp.getElementsByClassName("groupDataModifierListName");
    let color = gp.getElementsByClassName("groupDataColor")[0].value;
    let master = gp.getElementsByClassName("groupDataMaster")[0].value;
    let searchable = gp.getElementsByClassName("groupDataSearchable")[0].value;

    let members=[];
    let modifiers=[];

    for(let i = 0; i < memberlist.length; i++){
        let str = memberlist[i].innerHTML.replace(")", "");
        str = str.split("(");
        members.push(str[1]);
    }

    for(let i = 0; i < modifierlist.length; i++){
        let str = modifierlist[i].innerHTML.replace(")", "");
        str = str.split("(");
        modifiers.push(str[1]);
    }

    let data = createJsonGroup(userKey, num, name, members, modifiers, color, master, searchable);
    data.target = t;

    let json = JSON.stringify(data);
    console.log(data);

    if(typeof(date)=="undefined"){
        let input = document.getElementsByClassName("calendarHeadDateInfo")[0];
        let inputYear = parseInt(input.value.substring(0,4));
        let inputMonth = parseInt(input.value.substring(4,6));
        let inputDay = parseInt(input.value.substring(6,8));
        date = getThisDay(inputYear, inputMonth, inputDay, 0, 0)
    }

    XHRGroup.onreadystatechange=function(){

        if(XHRGroup.readyState==4){
            if(XHRGroup.status==200){
                getGroupSchedule(userKey, date);
            }
        }
    }
    XHRGroup.open("POST", "groupModifier", true);
    XHRGroup.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRGroup.send(json);
}

 

5) 그룹 - 멤버 추가, 삭제

 

a. DAO 

public void insertMember(GroupMemberDTO gmDTO){

    String sql="select count(*) from groupmember where groupnum = ? and id = ? ";

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try{
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gmDTO.getGroupnum());
        pstmt.setString(2, gmDTO.getId());
        System.out.println(pstmt);
        rs = pstmt.executeQuery();
        int temp = 0;

        while(rs.next()) {
            temp = rs.getInt("count(*)");
        }
        pstmt.clearParameters();

        if(temp==0) {
            sql="insert into groupmember(groupnum, id) value (?,?)";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, gmDTO.getGroupnum());
            pstmt.setString(2, gmDTO.getId());
            pstmt.executeUpdate();
        }
    }
    catch(Exception e){
        System.out.println("GroupDAO > insertMember Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

public void deleteMember(GroupMemberDTO gmDTO){

    String sql="select num from groupmember where id = ? and groupnum = ?";

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try{
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gmDTO.getId());
        pstmt.setString(2, gmDTO.getGroupnum());
        System.out.println(pstmt);
        rs = pstmt.executeQuery();

        while(rs.next()) {
            gmDTO.setNum(rs.getString("num"));
        }
        pstmt.clearParameters();

        sql="delete from groupmember where num = ?";
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, gmDTO.getNum());
        System.out.println(pstmt);
        pstmt.executeUpdate();
    }
    catch(Exception e){
        System.out.println("GroupDAO > deleteMember  Error : "+ e);
    }
    finally{
        close(conn, pstmt);
    }
}

 

b. Servlet 

package ServletCalendar;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import DAO.GroupDAO;
import DTO.GroupDTO;
import DTO.GroupMemberDTO;
import DTO.MemberDTO;

@WebServlet("/groupMemberInsert")
public class groupMemberInsert extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		
		String id = request.getParameter("userKey");
		String num = request.getParameter("groupnum");
		String target=request.getParameter("target");
		String master=request.getParameter("master");
		
		GroupMemberDTO gmDTO = new GroupMemberDTO();
		gmDTO.setId(target);
		gmDTO.setGroupnum(num);
		
		GroupDTO gDTO = new GroupDTO();
		gDTO.setMaster(master);
		
		MemberDTO mDTO = new MemberDTO();
		mDTO.setId(id);
		
		GroupDAO gDAO = GroupDAO.getInstance();
		
		if(gDTO.getMaster().equals(mDTO.getId())) {
			gDAO.insertMember(gmDTO);
		}
	}
}
package ServletCalendar;

import java.io.BufferedReader;
import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import DAO.GroupDAO;
import DTO.GroupDTO;
import DTO.GroupMemberDTO;
import DTO.GroupModifierDTO;
import DTO.MemberDTO;

@WebServlet("/groupMemberDelete")
public class groupMemberDelete extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		String json = readJSON(request);
		JSONObject data = objJSON(json);
		
		String id = String.valueOf(data.get("userKey"));
		String num = String.valueOf(data.get("num"));
		String target=String.valueOf(data.get("target"));
		String master=String.valueOf(data.get("master"));

		GroupDTO gDTO = new GroupDTO();
		MemberDTO mDTO = new MemberDTO();
		GroupMemberDTO gmDTO = new GroupMemberDTO();
		GroupModifierDTO gdDTO = new GroupModifierDTO();
		
		master = master.replace("\"", "");
		master = master.replace("\'", "");
		mDTO.setId(id);
		gDTO.setGroupnum(num);
		gDTO.setMaster(master);
		
		gmDTO.setId(target);
		gmDTO.setGroupnum(num);
		
		gdDTO.setId(target);
		gdDTO.setGroupnum(num);
		
		
		GroupDAO gDAO = GroupDAO.getInstance();
		
		// 그룹 멤버 삭제 > 자신이 권한자라면 속해있는 그룹원을 추방할 수 있음 
		if(gDTO.getMaster().equals(mDTO.getId())) {
			gDAO.deleteMember(gmDTO);
			gDAO.deleteModifier(gdDTO);
		}
	}

	protected String readJSON(HttpServletRequest request) { 
		StringBuffer json = new StringBuffer(); 
		String line = null;
		
		try { 
			BufferedReader reader=request.getReader();

			while((line=reader.readLine())!=null){ 
				json.append(line); 
			}
		}
		catch(Exception e) {
			System.out.println("JSON 파일을 읽어오던 중 오류 발생");
		}
		return json.toString(); 
	}
	
	protected JSONObject objJSON(String str) {
		Object obj=null;
		JSONObject json=null;
		System.out.println(str);
		try {
			JSONParser parser = new JSONParser();
			obj=parser.parse(str);
			json=(JSONObject)obj;
		}
		catch(Exception e) {
			System.out.println("JSON 변환 중 오류 발생: "+e);
		}
		return json;
	}

}

 

c. AJAX 

function addGroupMember(date){

    let target = event.target;
    let v = target.parentNode; //memerListBox
    let p = v.parentNode; //groupDataMemberResult
    let pp = p.parentNode; //groupDataMemberAdd
    let ppp = pp.parentNode; //groupElement

    let groupnum = ppp.getElementsByClassName("groupDataNum")[0].value;
    let master = ppp.getElementsByClassName("groupDataMaster")[0].value;

    let list = document.getElementsByClassName("groupDataMemberResult")[0];
    list.innerHTML = "";
    searchGroupMember();

    if(userKey!=master){
        return;
    }

    let memberId = v.getElementsByClassName("memerListId")[0].innerHTML;

    if(typeof(date)=="undefined"){
        let input = document.getElementsByClassName("calendarHeadDateInfo")[0];
        let inputYear = parseInt(input.value.substring(0,4));
        let inputMonth = parseInt(input.value.substring(4,6));
        let inputDay = parseInt(input.value.substring(6,8));

        date = getThisDay(inputYear, inputMonth, inputDay, 0, 0)
    }

    createXHRGroup();

    XHRGroup.onreadystatechange=function(){
        if(XHRGroup.readyState==4){
            if(XHRGroup.status==200){
                webSocket.send(memberId);
                console.log(webSocket);
            }
        }
    }
    XHRGroup.open("POST", "groupMemberInsert", true);
    XHRGroup.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRGroup.send("userKey="+userKey+"&groupnum="+groupnum+"&target="+memberId+"&master="+master);
}

// Group 멤버를 삭제하는 것
function groupDataMemberDelete(date){
    createXHRGroup();

    let target = event.target;
    let v = target.parentNode
    let p = v.parentNode;
    let t = p.getElementsByClassName("groupDataMemebersListInputId")[0].value;
    let gp = p.parentNode.parentNode;

    let num = gp.getElementsByClassName("groupDataNum")[0].value;
    let name = gp.parentNode.getElementsByClassName("groupDataName")[0].value;

    let memberlist = gp.getElementsByClassName("groupDataMemebersListName");
    let modifierlist = gp.getElementsByClassName("groupDataModifierListName");
    let color = gp.getElementsByClassName("groupDataColor")[0].value;
    let master = gp.getElementsByClassName("groupDataMaster")[0].value;
    let searchable = gp.getElementsByClassName("groupDataSearchable")[0].value;

    let members=[];
    let modifiers=[];

    for(let i = 0; i < memberlist.length; i++){
        let str = memberlist[i].innerHTML.replace(")", "");
        str = str.split("(");
        members.push(str[1]);
    }

    for(let i = 0; i < modifierlist.length; i++){
        let str = modifierlist[i].innerHTML.replace(")", "");
        str = str.split("(");
        modifiers.push(str[1]);
    }

    let data = createJsonGroup(userKey, num, name, members, modifiers, color, master, searchable);
    data.target = t;
    console.log(data);
    let json = JSON.stringify(data);

    if(typeof(date)=="undefined"){
        let input = document.getElementsByClassName("calendarHeadDateInfo")[0];
        let inputYear = parseInt(input.value.substring(0,4));
        let inputMonth = parseInt(input.value.substring(4,6));
        let inputDay = parseInt(input.value.substring(6,8));
        date = getThisDay(inputYear, inputMonth, inputDay, 0, 0)
    }

    XHRGroup.onreadystatechange=function(){

        if(XHRGroup.readyState==4){
            if(XHRGroup.status==200){
                getGroupSchedule(userKey, date);
            }
        }
    }
    XHRGroup.open("POST", "groupMemberDelete", true);
    XHRGroup.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRGroup.send(json);
}

 

6) 그룹 정보 조회

// 그룹 정보를 가져옴 
public List<GroupDTO> groupList(String userKey){
    List<GroupDTO> temp= new ArrayList<GroupDTO>();
    List<GroupDTO> list= new ArrayList<GroupDTO>();

    String sql="select groupnum from groupMember where id = ? and invite = 'accept'";

    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try
    {
        conn = getConnection();
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, userKey);

        System.out.println(pstmt);
        rs = pstmt.executeQuery();

        while(rs.next()){
            GroupDTO gDTO = new GroupDTO();
            gDTO.setGroupnum(rs.getString("groupnum"));
            temp.add(gDTO);
        }


        for(int i = 0; i<temp.size(); i++) {
            List<String> members = new ArrayList<String>();
            List<String> modifiers = new ArrayList<String>();
            GroupDTO gDTO = new GroupDTO();
            sql = "select * from groupdata where groupnum = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, temp.get(i).getGroupnum());
            rs = pstmt.executeQuery();

            while(rs.next()){
                gDTO.setGroupnum(rs.getString("groupnum"));
                gDTO.setGroupname(rs.getString("groupname"));
                gDTO.setGroupcolor(rs.getString("groupcolor"));
                gDTO.setSearchable(rs.getString("searchable"));
                gDTO.setMaster(rs.getString("master"));
            }
            pstmt.clearParameters();

            sql = "select groupmember.id, groupmember.invite, member.name from groupmember left join member on groupmember.id = member.id where groupmember.groupnum = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, temp.get(i).getGroupnum());
            rs = pstmt.executeQuery();

            while(rs.next()) {
                GroupMemberDTO gmDTO = new GroupMemberDTO();
                gmDTO.setId(rs.getString("id"));
                gmDTO.setName(rs.getString("name"));
                gmDTO.setInvite(rs.getString("invite"));

                if(gmDTO.getInvite().equals("accept")) {
                    String tempstr = gmDTO.getName() + "("+gmDTO.getId()+")";
                    members.add(tempstr);
                }
            }
            pstmt.clearParameters();

            sql = "select groupmodifier.id, member.name from groupmodifier left join member on groupmodifier.id = member.id where groupnum = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, temp.get(i).getGroupnum());
            rs = pstmt.executeQuery();

            while(rs.next()) {
                GroupModifierDTO gdDTO = new GroupModifierDTO();
                gdDTO.setId(rs.getString("id"));
                gdDTO.setName(rs.getString("name"));
                String tempstr = gdDTO.getName() + "("+gdDTO.getId()+")";
                modifiers.add(tempstr);	
            }

            pstmt.clearParameters();
            gDTO.setMembers(members.toArray(new String[members.size()]));
            gDTO.setModifiers(modifiers.toArray(new String[modifiers.size()]));
            list.add(gDTO);
        }
    }
    catch(Exception e){
        System.out.println("Group DAO> ::Select Error(val == 1) : "+ e);
    }
    finally{
        close(conn, pstmt, rs);
    }
    return list;
}

 

Group 멤버는 AJAX 에서 스케줄과 같이 조회하고 가져오고 있다. 

 

2. 세부 기능 구현

1) 그룹 추가 양식 

// 그룹 추가 버튼 누를시 폼을 생성함
function addGroupBtn(){
    let v = document.getElementsByClassName("groupMain")[0];
    let flag = document.getElementsByClassName("groupAddFlag")[0];
    let button = document.getElementsByClassName("groupAdd")[0];
    if(flag.value=="true"){
        let p = document.getElementsByClassName("groupMain")[0];
        flag.setAttribute("value", "false");
        p.removeChild(p.firstChild);
        button.classList.remove("Xbutton");
        return;
    }
    else{
        flag.setAttribute("value", "true");
        button.classList.add("Xbutton");
    }

    c = document.createElement("div");
    c.classList.add("groupElement");

    cc=document.createElement("input");
    cc.setAttribute("type", "hidden");
    cc.classList.add("groupDataNum");
    c.appendChild(cc);

    cc=document.createElement("input");
    cc.setAttribute("type", "text");
    cc.classList.add("groupDataName");
    cc.setAttribute("placeholder", "그룹의 이름을 입력하세요.")
    cc.setAttribute("style", "width: calc(100% - 10px);")
    c.appendChild(cc);

    cc=document.createElement("input");
    cc.setAttribute("type", "color");
    cc.classList.add("groupDataColor");
    c.appendChild(cc);

    cc=document.createElement("input");
    cc.setAttribute("type", "hidden");
    cc.classList.add("groupDataMaster");
    c.appendChild(cc);

    cc = document.createElement("select");
    cc.classList.add("groupDataSearchable");
    ccc = document.createElement("option");
    ccc.classList.add("groupDataSearchOption");
    ccc.setAttribute("value", "disable");
    ccc.innerHTML = "비공개";
    cc.appendChild(ccc);
    ccc = document.createElement("option");
    ccc.classList.add("groupDataSearchOption");
    ccc.setAttribute("value", "able");
    ccc.innerHTML = "공개";
    cc.appendChild(ccc);

    c.appendChild(cc);

    cc = document.createElement("input");
    cc.classList.add("groupDataClose");
    cc.setAttribute("type", "button");
    cc.setAttribute("value", "닫기");
    cc.addEventListener("click", closeGroupAdd)
    c.appendChild(cc);

    cc = document.createElement("input");
    cc.classList.add("groupDataAdd2");
    cc.setAttribute("type", "button");
    cc.setAttribute("value", "만들기");
    cc.addEventListener("click", addGroup)
    c.appendChild(cc);

    v.insertBefore(c, v.firstChild);
}

// 그룹 추가 버튼 요소를 제거
function closeGroupAdd(){
    let flag = document.getElementsByClassName("groupAddFlag")[0];
    let button = document.getElementsByClassName("groupAdd")[0];

    if(flag.value=="true"){
        let p = document.getElementsByClassName("groupElement")[0].parentNode;
        p.removeChild(p.firstChild);
        flag.setAttribute("value", "false");
        button.classList.remove("Xbutton");
    }
    else{
        return;
    }
}

 

2) 그룹 초대를 위한 자동 완성

package ServletCalendar;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import DAO.GroupDAO;
import DTO.MemberDTO;


@WebServlet("/groupMemberSearch")
public class groupMemberSearch extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@SuppressWarnings("unchecked")
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		String word = request.getParameter("word");
		GroupDAO gDAO = GroupDAO.getInstance();
		JSONArray members = new JSONArray();
		
		List<MemberDTO>mlist=gDAO.memberList(word);
			
		for(int j = 0; j<mlist.size(); j++) {
			JSONObject json = new JSONObject();
			json.put("num", mlist.get(j).getNum());
			json.put("id", mlist.get(j).getId().toString());
			json.put("name", mlist.get(j).getName().toString());
			members.add(json);
		}
		response.setContentType("application/json");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		out.print(members.toString());
		out.flush();
	}
	
	protected String readJSON(HttpServletRequest request) { 
		StringBuffer json = new StringBuffer(); 
		String line = null;
		
		try { 
			BufferedReader reader=request.getReader();

			while((line=reader.readLine())!=null){ 
				json.append(line); 
			}
		}
		catch(Exception e) {
			System.out.println("JSON 파일을 읽어오던 중 오류 발생");
		}
		return json.toString(); 
	}
	
	protected JSONObject objJSON(String str) {
		Object obj=null;
		JSONObject json=null;
		System.out.println(str);
		
		try {
			JSONParser parser = new JSONParser();
			obj=parser.parse(str);
			json=(JSONObject)obj;
		}
		catch(Exception e) {
			System.out.println("JSON 변환 중 오류 발생: "+e);
		}
		
		return json;
	}
}
function searchGroupMember(){
    let v = event.target;
    let word = v.innerHTML;
    let p = v.parentNode;
    let list = p.getElementsByClassName("groupDataMemberResult")[0];

    if(word.length==0){
        while(list.hasChildNodes()){
            list.removeChild(list.firstChild);
        }
        return;
    }
    createXHRMember();
    XHRMember.onreadystatechange=function(){
        if(XHRMember.readyState==4){
            if(XHRMember.status==200){
                let json = JSON.parse(XHRMember.responseText, "text/json");
                createSearchGroupMember(v, json);
            }
        }
    }
    XHRMember.open("POST", "groupMemberSearch", true);
    XHRMember.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    XHRMember.send("userKey="+userKey+"&word="+word);
}