Skip to content

Commit

Permalink
Merge pull request #147 from lass9436/feature6
Browse files Browse the repository at this point in the history
[이영민] step-6 댓글, step-7 ajax 댓글 구현
  • Loading branch information
github-actions[bot] authored Aug 2, 2024
2 parents b22a88a + 3f614d5 commit dc9a73e
Show file tree
Hide file tree
Showing 30 changed files with 1,759 additions and 238 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
![캡처](https://github.com/user-attachments/assets/b68b353e-d9ad-4e26-8a03-ad8f807d3189)
# JSP CAFE

![캡처](https://github.com/user-attachments/assets/1e0aabf4-45cf-4406-9b12-ef38aced5867)

5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,14 @@ dependencies {
implementation 'mysql:mysql-connector-java:8.0.29'
// json
implementation 'org.json:json:20210307'
// jackson
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'

testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
// mockito
testImplementation 'org.mockito:mockito-core:5.12.0'
testImplementation 'org.mockito:mockito-junit-jupiter:5.12.0'
}

test {
Expand Down
17 changes: 0 additions & 17 deletions src/main/java/lass9436/IndexServlet.java

This file was deleted.

65 changes: 65 additions & 0 deletions src/main/java/lass9436/comment/model/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package lass9436.comment.model;

public class Comment {

private long commentSeq;
private long userSeq;
private long questionSeq;
private String writer;
private String contents;
private String useYn;

public Comment() {}

public Comment(long userSeq, long questionSeq, String writer, String contents) {
this.userSeq = userSeq;
this.questionSeq = questionSeq;
this.writer = writer;
this.contents = contents;
this.useYn = "Y";
}

public long getCommentSeq() {
return commentSeq;
}

public void setCommentSeq(long commentSeq) {
this.commentSeq = commentSeq;
}

public long getUserSeq() {
return userSeq;
}

public void setUserSeq(long userSeq) {
this.userSeq = userSeq;
}

public long getQuestionSeq() {
return questionSeq;
}

public void setQuestionSeq(long questionSeq) {
this.questionSeq = questionSeq;
}

public String getWriter() {
return writer;
}

public void setWriter(String writer) {
this.writer = writer;
}

public String getContents() {
return contents;
}

public void setContents(String contents) {
this.contents = contents;
}

public String getUseYn() { return useYn; }

public void setUseYn(String useYn) { this.useYn = useYn; }
}
15 changes: 15 additions & 0 deletions src/main/java/lass9436/comment/model/CommentRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package lass9436.comment.model;

import java.util.List;

public interface CommentRepository {
Comment save(Comment comment);

Comment findByCommentSeq(long commentSeq);

List<Comment> findAll();

void deleteByCommentSeq(long commentSeq);

List<Comment> findByQuestionSeq(long questionSeq);
}
135 changes: 135 additions & 0 deletions src/main/java/lass9436/comment/model/CommentRepositoryDBImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package lass9436.comment.model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import lass9436.config.Database;

public class CommentRepositoryDBImpl implements CommentRepository {

@Override
public Comment save(Comment comment) {
String sqlInsert = "INSERT INTO comments (userSeq, questionSeq, writer, contents) VALUES (?, ?, ?, ?)";
String sqlUpdate = "UPDATE comments SET userSeq = ?, questionSeq = ?, writer = ?, contents = ? WHERE commentSeq = ?";
boolean isInsert = comment.getCommentSeq() == 0;

try (Connection conn = Database.getConnection();
PreparedStatement ps = isInsert ?
conn.prepareStatement(sqlInsert, Statement.RETURN_GENERATED_KEYS) :
conn.prepareStatement(sqlUpdate)) {

ps.setLong(1, comment.getUserSeq());
ps.setLong(2, comment.getQuestionSeq());
ps.setString(3, comment.getWriter());
ps.setString(4, comment.getContents());

if (!isInsert) {
ps.setLong(5, comment.getCommentSeq());
}

ps.executeUpdate();

if (isInsert) {
try (ResultSet generatedKeys = ps.getGeneratedKeys()) {
if (generatedKeys.next()) {
comment.setCommentSeq(generatedKeys.getLong(1));
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}

return comment;
}

@Override
public Comment findByCommentSeq(long commentSeq) {
String sql = "SELECT * FROM comments WHERE commentSeq = ? AND useYn = 'Y'";
Comment comment = null;

try (Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, commentSeq);

try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
comment = mapRow(rs);
}
}
} catch (SQLException e) {
e.printStackTrace();
}

return comment;
}

@Override
public List<Comment> findAll() {
String sql = "SELECT * FROM comments WHERE useYn = 'Y'";
List<Comment> comments = new ArrayList<>();

try (Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {

while (rs.next()) {
comments.add(mapRow(rs));
}
} catch (SQLException e) {
e.printStackTrace();
}

return comments;
}

@Override
public void deleteByCommentSeq(long commentSeq) {
String sql = "UPDATE comments SET useYn = 'N' WHERE commentSeq = ?";

try (Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, commentSeq);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}

@Override
public List<Comment> findByQuestionSeq(long questionSeq) {
String sql = "SELECT * FROM comments WHERE questionSeq = ? AND useYn ='Y'";
List<Comment> comments = new ArrayList<>();

try (Connection conn = Database.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, questionSeq);

try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
comments.add(mapRow(rs));
}
}
} catch (SQLException e) {
e.printStackTrace();
}

return comments;
}

private Comment mapRow(ResultSet rs) throws SQLException {
Comment comment = new Comment();
comment.setCommentSeq(rs.getLong("commentSeq"));
comment.setUserSeq(rs.getLong("userSeq"));
comment.setQuestionSeq(rs.getLong("questionSeq"));
comment.setWriter(rs.getString("writer"));
comment.setContents(rs.getString("contents"));
comment.setUseYn(rs.getString("useYn"));
return comment;
}
}
47 changes: 47 additions & 0 deletions src/main/java/lass9436/comment/model/CommentRepositoryImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package lass9436.comment.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class CommentRepositoryImpl implements CommentRepository {
private final Map<Long, Comment> commentStore = new ConcurrentHashMap<>();
private long sequence = 0L;

@Override
public Comment save(Comment comment) {
if (comment.getCommentSeq() == 0) {
comment.setCommentSeq(++sequence);
}
commentStore.put(comment.getCommentSeq(), comment);
return comment;
}

@Override
public Comment findByCommentSeq(long commentSeq) {
return commentStore.get(commentSeq);
}

@Override
public List<Comment> findAll() {
return new ArrayList<>(commentStore.values());
}

@Override
public void deleteByCommentSeq(long commentSeq) {
commentStore.remove(commentSeq);
}

@Override
public List<Comment> findByQuestionSeq(long questionSeq) {
List<Comment> comments = new ArrayList<>();
for (Comment comment : commentStore.values()) {
if (comment.getQuestionSeq() == questionSeq) {
comments.add(comment);
}
}
return comments;
}
}

67 changes: 67 additions & 0 deletions src/main/java/lass9436/comment/servlet/CommentServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package lass9436.comment.servlet;

import java.io.IOException;

import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lass9436.comment.model.Comment;
import lass9436.comment.model.CommentRepository;

@WebServlet("/comment")
public class CommentServlet extends HttpServlet {

private CommentRepository commentRepository;

@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
commentRepository = (CommentRepository)config.getServletContext().getAttribute("commentRepository");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String contents = req.getParameter("contents");
long questionSeq = Long.parseLong(req.getParameter("questionSeq"));
String writer = (String) req.getSession(false).getAttribute("userName");
long userSeq = (long)req.getSession(false).getAttribute("userSeq");
Comment comment = new Comment(userSeq, questionSeq, writer, contents);
commentRepository.save(comment);

// JSON 응답 생성
ObjectMapper objectMapper = new ObjectMapper();
String jsonResponse = objectMapper.writeValueAsString(comment);

// 응답 설정
resp.setContentType("application/json");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write(jsonResponse);
resp.setStatus(HttpServletResponse.SC_OK);
}

@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) {
long seq = Long.parseLong(req.getParameter("seq"));
Comment comment = commentRepository.findByCommentSeq(seq);

if (comment == null) {
resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
if (req.getSession(false) == null){
resp.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
if (comment.getUserSeq() != (long)req.getSession(false).getAttribute("userSeq")){
resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
return;
}

commentRepository.deleteByCommentSeq(seq);
resp.setStatus(HttpServletResponse.SC_OK);
}
}
6 changes: 6 additions & 0 deletions src/main/java/lass9436/config/AppContextListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import lass9436.comment.model.CommentRepository;
import lass9436.comment.model.CommentRepositoryDBImpl;
import lass9436.question.model.QuestionRepository;
import lass9436.question.model.QuestionRepositoryDBImpl;
import lass9436.user.model.UserRepository;
Expand All @@ -21,5 +23,9 @@ public void contextInitialized(ServletContextEvent sce) {
//QuestionRepository questionRepository = new QuestionRepositoryImpl();
QuestionRepository questionRepository = new QuestionRepositoryDBImpl();
sce.getServletContext().setAttribute("questionRepository", questionRepository);
// CommentRepository 인스턴스를 생성하고 컨텍스트에 저장
//CommentRepository commentRepository = new CommentRepositoryImpl();
CommentRepository commentRepository = new CommentRepositoryDBImpl();
sce.getServletContext().setAttribute("commentRepository", commentRepository);
}
}
Loading

0 comments on commit dc9a73e

Please sign in to comment.