[자바 JDBC 게시판] 8일차

김정현·2022년 8월 18일

JDBC게시판

목록 보기
8/9

1. 로그인 관련 권한 , 로그아웃 기능

1) 로그인, 로그아웃 기능

    public class Session {
        public int loginedMemberId;
        public Member loginedMember;
        public Session() {
            loginedMemberId = -1;
        }
        public void logout() {
            Container.session.loginedMemberId = -1;
            Container.session.loginedMember = null;			
        }
        public void login(Member member) {
            Container.session.loginedMember = member;
            Container.session.loginedMemberId = member.id;		
        }
        public boolean isLogined() {
            return loginedMemberId != -1;
        }
  • Session안에 login( ) ,logout( ) 메소드를 만들어서 사용

2) 로그인 관련 권한

	if(Container.session.isLogined() == false){
		System.out.println("로그인 후 이용해주세요.");
		return;
	}
	if(Container.session.isLogined()){
		System.out.println("로그아웃 후 이용해주세요.");
		return;
	}
  • isLogined( ) 는 로그인이 된상태라면 true , 로그인이 안된상태라면 false를 반환
  • 로그인 되었는지 체크하여 로그인시에만 write, modify, delete, logout 가능하게 함
  • 로그인 되었는지 체크하여 로그인이 안된 상태에서만 join, login을 가능하게 함

2 . 게시물 작성시 작성자의 회원번호를 저장

        public void doWrite(String cmd) {
			if(Container.session.isLogined() == false){
				System.out.println("로그인 후 이용해주세요.");
				return;
			}
			System.out.println("== 게시물 작성 ==");
		
			System.out.printf("제목 : ");
			String title = sc.nextLine();
			System.out.printf("내용 : ");
			String body = sc.nextLine();
			int memberId = Container.session.loginedMemberId;
			int id = articleService.doWrite(memberId, title, body);
  • write 작성시 로그인된 회원의 id를 게시글의 memberId에 저장
			sql.append("INSERT INTO article");
			sql.append(" SET regDate = NOW()");
			sql.append(", updateDate = NOW()");
			sql.append(", memberId = ?", memberId);
			sql.append(", title = ?", title);
			sql.append(", `body` = ?", body);
  • DB에 보낼 쿼리문 수정

3. 게시물 리스트시 작성자 이름이 나오게 구현

1) 게시물 테이블과 회원테이블 조인

	public List<Article> getArticles() {
		SecSql sql = new SecSql();
		sql.append("SELECT A.*, M.name AS extra__writer");
		sql.append(" FROM article AS A");
		sql.append(" INNER JOIN `member` AS M");
		sql.append(" ON A.memberId = M.id");
		sql.append(" ORDER BY id DESC");
			
List<Map<String, Object>> articlesListMap = DBUtil.selectRows(Container.conn, sql);								
  • 게시물테이블에서 게시물의 작성자를 가져오려면 회원테이블과 Join을 해야한다.
  • 게시물의 작성자의 회원번호와 회원테이블의 회원번호를 통해 Join 하여 작성자정보를 알수있음

2) Article 생성자 수정(extra__writer 추가)

	public String extra__writer;

	public Article(Map<String, Object> articleMap) {
		this.id = (int) articleMap.get("id");
		this.regDate = (LocalDateTime) articleMap.get("regDate");
		this.updateDate = (LocalDateTime) articleMap.get("updateDate");
		this.memberId = (int) articleMap.get("memberId");
		this.title = (String) articleMap.get("title");
		this.body = (String) articleMap.get("body");
	
		if (articleMap.get("extra__writer") != null) {
			this.extra__writer = (String) articleMap.get("extra__writer");
		}
	}
  • 조인 후 Article객체에서 작성자를 받아들일수 있는 필드(String extra__writer)를 추가
  • 이때 작성자가 없는 글일수도 있으니 작성자가 있는 글만 값을 저장

3) 리스트 시 작성자도 보여줌

	System.out.printf("번호  /  %8s         /  제목   /  작성자\n", "작성날짜");
	for (Article article : articles) {
		System.out.printf("%4d  /  %s  /  %s  /  %s\n", article.id, 				article.regDate, article.title,article.extra__writer);

4. 상세 페이지에 작성자와 조회수 표시, 게시물 리스트에 조회수 표시

1) 상세 페이지에 작성자 표시

    public Article getArticleById(int id) {
            SecSql sql = new SecSql();
            sql.append("SELECT A.*, M.name AS extra__writer");
            sql.append(" FROM article AS A");
            sql.append(" INNER JOIN `member` AS M");
            sql.append(" ON A.memberId = M.id");
            sql.append(" WHERE A.id = ?" , id);	
        Map<String, Object> articleMap = DBUtil.selectRow(Container.conn, sql);

        if (articleMap.isEmpty()) {
            return null;
        }

        return new Article(articleMap);
    }
 //가져온 게시물의 extra__writer를 detail시 보여줌 
	System.out.printf("작성자 : %s\n", article.extra__writer);
  • article list와 동일하게 member테이블 과 Join을 해서 작성자 이름을 가져온다.
  • 이때 id를 조건으로 게시물 하나를 가져온다.

2) 조회수 표시

    public void increaseHit(int id) {
        SecSql sql = new SecSql();	
        sql.append("UPDATE article");
       	sql.append(" SET hit = hit +1");
        sql.append(" WHERE id = ?", id);

        DBUtil.update(Container.conn, sql);
    }
  • DB에서 id로 찾은 해당 게시물 로우에 UPDATE(수정)를 통해 hit를 증가 시킴
  • 상세보기시 increaseHit(int id) 메소드를 실행

5. 게시물 수정, 삭제시 권한 체크

	public void doModify(String cmd) {
		if(Container.session.isLogined() == false){
			System.out.println("로그인 후 이용해주세요.");
			return;
		}
        int id = Integer.parseInt(cmd.split(" ")[2]);

        Article article = articleService.getArticleById(id);

        if (article == null) {
            System.out.printf("%d번 게시글은 존재하지 않습니다.\n", id);
            return;
        }

        if(article.memberId != Container.session.loginedMemberId) {
            System.out.println("해당 게시물에 대한 권한이 없습니다.");
            return;
        }
  • 로그인이 되어있을때 수정이 가능

  • 로그인된 회원의 id( Container.session.loginedMemberId )와

    게시물작성시 게시물에 남긴 회원의 id (memberId)가 일치할때만 수정이 가능

  • delete(삭제) 도 modify(수정) 과 동일하다

0개의 댓글