Skip to content

Commit

Permalink
style: javadoc 주석 생성
Browse files Browse the repository at this point in the history
  • Loading branch information
eckrin committed Jul 22, 2024
1 parent a84636c commit c82d120
Show file tree
Hide file tree
Showing 38 changed files with 198 additions and 5 deletions.
4 changes: 4 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/main/java/common/FileUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import java.io.IOException;
import java.util.UUID;

/**
* 파일 저장, 확장자 추출, 파일 생성 등을 담당하는 유틸리티 클래스
*/
public class FileUtils {

public static final String STATIC_DIR_PATH = "./src/main/resources/static";
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/common/JsonBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.util.Collection;

/**
* User 리스트를 Json으로 반환하기 위한 빌터 클래스
* User 리스트를 Json으로 반환하기 위한 빌더 클래스
*/
public class JsonBuilder {

Expand Down
12 changes: 11 additions & 1 deletion src/main/java/common/RequestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
import java.util.LinkedList;
import java.util.Map;

/**
* Request를 파싱하여 Request Line, Header, Body를 추출하는 클래스
* Header와 Body는 \r\n\r\n으로 구분하며, 헤더의 Content-Length값에 따라서 Body를 읽는다.
*/
public class RequestUtils {

private static final Logger logger = LoggerFactory.getLogger(RequestUtils.class);
Expand Down Expand Up @@ -90,7 +94,8 @@ public static HttpRequest parseHttpRequest(InputStream in) throws IOException {

/**
* request로 들어온 HTTP 요청을 한줄씩 파싱하여 적절한 HttpRequest 객체를 생성
* @param request 요청 전문
* @param request Request Line과 Header
* @param body request body (byte[])
* @return HttpRequest
*/
private static HttpRequest parseRequest(String request, byte[] body) {
Expand Down Expand Up @@ -144,6 +149,11 @@ private static HttpRequest parseRequest(String request, byte[] body) {
.build();
}

/**
* Multipart 파일의 Body 구분자를 추출하기 위한 메서드
* @param contentType Request 헤더의 Content-Type
* @return Body Delimiter
*/
public static String getBoundaryKey(String contentType) {
return contentType.split("boundary=")[1];
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/common/ResponseUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@

import java.util.Map;

/**
* 케이스에 따라서 다양한 HttpResponse 객체를 생성하기 위한 클래스
*/
public class ResponseUtils {

public static HttpResponse redirectToView(ViewPath viewPath) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/common/StringUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import java.io.OutputStream;
import java.util.*;

/**
* 다양한 문자열 혹은 바이트 처리를 위한 클래스
*/
public class StringUtils {

public static String createRandomUUID() {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/common/WebUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ public static boolean isMethodHeader(String method) {
}
}

/**
* 파일 확장자에 해당하는 적절한 MIME 타입값 리턴
* @param extension 파일 확장자
* @return MIME 타입값
*/
public static String getProperContentType(String extension) {
return MIME.findByKey(extension).getType();
}
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/db/ArticleH2Database.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,21 @@
import java.util.ArrayList;
import java.util.Collection;

/**
* H2 Database의 Article 테이블을 조작하기 위한 API
*/
public class ArticleH2Database {

private final static String URL = DatabaseInfo.DB_URL.getKey();
private final static String USERNAME = DatabaseInfo.DB_USERNAME.getKey();
private final static String PASSWORD = DatabaseInfo.DB_PASSWORD.getKey();

/**
* Article을 저장합니다.
* @param article 저장할 Article 객체
* @param userId Article 작성자
* @return 저장된 Article 객체
*/
public static Article createArticle(Article article, String userId) {
try (Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
String query = "INSERT INTO articles (user_id, image_path, content) VALUES (?, ?, ?)";
Expand All @@ -29,6 +38,10 @@ public static Article createArticle(Article article, String userId) {
return article;
}

/**
* Article 테이블에 저장된 모든 데이터를 컬렉션으로 반환
* @return Article 테이블에 저장된 데이터 리스트
*/
public static Collection<Article> getArticleList() {
Collection<Article> articles = new ArrayList<>();

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/db/DatabaseInfo.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package db;

/**
* 데이터베이스 커넥션을 위한 정보를 저장하는 Enum 클래스
* 프로퍼티 파일과 환경변수를 이용하여 관리하는 것이 더 좋아보인다
*/
public enum DatabaseInfo {
DB_URL("jdbc:h2:tcp://localhost/~/test"),
DB_USERNAME("sa"),
Expand Down
21 changes: 20 additions & 1 deletion src/main/java/db/SessionDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,34 @@
import java.util.concurrent.ConcurrentHashMap;

/**
* sessionId-Session객체 쌍 저장
* sessionId-Session객체 쌍을 저장하는 In-memory Database
*/
public class SessionDatabase {
private static Map<String, Session> sessions = new ConcurrentHashMap<>();

/**
* UUID로 세션 ID를 생성하고, 유효시간을 30분으로 하는 세션을 생성, 저장합니다.
* @return 생성된 세션
*/
public static Session createDefaultSession() {
String SID = StringUtils.createRandomUUID();
Session createSession = new Session(SID, System.currentTimeMillis()+1800*1000);
sessions.put(SID, createSession);
return createSession;
}

/**
* SID로 세션 정보를 조회할 수 있습니다.
* @param SID 조회할 세션의 SID
* @return 조회된 세션 객체
*/
public static Session findSessionById(String SID) {
return sessions.get(SID);
}

/**
* HashMap에서 유효기간이 끝난 세션들을 찾고, 삭제합니다.
*/
public static void removeExpiredSessions() {
for (String id : sessions.keySet()) {
if(sessions.get(id).getAge()<System.currentTimeMillis()) {
Expand All @@ -31,12 +43,19 @@ public static void removeExpiredSessions() {
}
}

/**
* 특정 세션을 만료시킵니다.
* @param SID 만료시킬 세션 ID
*/
public static void invalidateSession(String SID) {
Session session = sessions.get(SID);
if(session!=null)
session.invalidateSession();
}

/**
* 유요한 세션 ID인지 여부를 확인합니다
*/
public static boolean isValidatedSession(String SID) {
if(SID==null) return false;
else return sessions.get(SID)!=null;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/db/SessionH2Database.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

import java.sql.*;

/**
* 세션을 H2 DB에 저장할 때 사용할 수 있는 API를 관리
* 세션 보관 정책을 인메모리에 저장하게 함에 따라 deprecated 되었습니다.
*/
@Deprecated
public class SessionH2Database {

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/db/SessionIdMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
* 세션 ID와 유저 ID를 매핑해주는 매퍼 클래스입니다.
*/
public class SessionIdMapper {
private static Map<String, String> sessionIds = new ConcurrentHashMap<>();

Expand Down
1 change: 1 addition & 0 deletions src/main/java/db/UserDatabase.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Deprecated
public class UserDatabase {
private static Map<String, User> users = new ConcurrentHashMap<>();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/db/UserH2Database.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public static User addUser(User user) {
return user;
}

// users; drop table users; select * from users
// where 1=1
public static User findUserById(String findUserId) {
try (Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD)) {
String query = "SELECT user_id, password, name, email FROM users WHERE user_id = ?";
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/exception/CannotResolveRequestException.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package exception;

/**
* HTTP Method 파싱이 불가능할 경우 발생하는 런타임 예외
*/
public class CannotResolveRequestException extends RuntimeException {
public CannotResolveRequestException() {}

Expand Down
3 changes: 3 additions & 0 deletions src/main/java/exception/SizeNotMatchException.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package exception;

/**
* Content-Length와 body 크기가 일치하지 않을 경우 발생시키는 런타임 예외
*/
public class SizeNotMatchException extends RuntimeException {
public SizeNotMatchException() {}

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/facade/ArticleFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,13 @@
import java.util.Arrays;
import java.util.List;

/**
* 게시글 관리 관련 기능 퍼사드 클래스
*/
public class ArticleFacade {

/**
* Multipartdata 형태의 HttpRequest에서 image와 content 추출 후 DB에 저장하는 메서드
* byte 단위로 body 파싱
*/
public static void saveArticleData(HttpRequest request) {
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/facade/AuthenticationFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,27 @@
import java.io.IOException;
import java.io.OutputStream;

/**
* 인증 공통 로직을 관리하는 퍼사드
*/
public class AuthenticationFacade {

/**
* 인증이 필요한 api에 인증되지 않은 유저가 접근하려 하는지 체크
* @param request HTTP 요청
* @param out 출력 스트림
*/
public static void redirectHomeIfNotAuthenticated(HttpRequest request, OutputStream out) throws IOException {
if(!SessionFacade.isAuthenticatedRequest(request)) {
ResponseUtils.redirectToView(ViewPath.DEFAULT).writeInBytes(out);
}
}

/**
* 인증된 유저가 인증 프로세스에 접근하려 하는지 체크
* @param request HTTP 요청
* @param out 출력 스트림
*/
public static void redirectHomeIfAuthenticated(HttpRequest request, OutputStream out) throws IOException {
if(SessionFacade.isAuthenticatedRequest(request)) {
ResponseUtils.redirectToView(ViewPath.DEFAULT).writeInBytes(out);
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/facade/SessionFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,18 @@
import model.Session;
import web.HttpRequest;

/**
* 세션을 관리하는 퍼사드
*/
public class SessionFacade {

private static final String SESSION_ID = "SID";

/**
* DB에서 새로운 생성을 생성하고, SessionId와 User정보를 in-memory 매퍼에 매핑시킨다
* @param userId 세션 생성 대상 유저
* @return 생성된 세션
*/
public static Session createSession(String userId) {
// 세션 저장소에 세션 생성
Session session = SessionDatabase.createDefaultSession();
Expand All @@ -18,6 +26,11 @@ public static Session createSession(String userId) {
return session;
}

/**
* 세션 정보를 조회하여 유효한 세션인지 확인
* @param request HTTP 요청
* @return return if Session is validated
*/
public static boolean isAuthenticatedRequest(HttpRequest request) {
String SID = request.getCookie().get(SESSION_ID);

Expand All @@ -26,12 +39,21 @@ public static boolean isAuthenticatedRequest(HttpRequest request) {
return SessionDatabase.isValidatedSession(SID);
}

/**
* 요청의 세션ID 정보를 무효화한다.
* @param request HTTP 요청
*/
public static void invalidateAndRemoveSession(HttpRequest request) {
String SID = request.getCookie().get(SESSION_ID);
SessionDatabase.invalidateSession(SID);
SessionDatabase.removeExpiredSessions();
}

/**
* 세션에서 유저 정보 추출
* @param request HTTP 요청
* @return 찾은 User Id
*/
public static String getUserIdFromSession(HttpRequest request) {
String SID = request.getCookie().get(SESSION_ID);
return SessionIdMapper.findUserIdBySessionId(SID);
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/facade/UserFacade.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,34 @@

import java.util.Map;

/**
* 유저 관련 퍼사드
*/
public class UserFacade {

/**
* 새로운 유저를 생성하고, DB에 저장한다.
* @param user 생성할 유저 정보
* @return 생성된 유자
*/
public static User createUser(User user) {
return UserH2Database.addUser(new User(user.getUserId(), user.getPassword(), user.getName(), user.getEmail()));
}

/**
* DB에서 user ID로 유저를 찾아서 반환
* @param userId 찾을 유저의 id
* @return 찾은 유저 정보
*/
public static User findUserByUserId(String userId) {
return UserH2Database.findUserById(userId);
}

/**
* 데이터베이스에 유저가 존재하는지 검증
* @param map HTTP body 정보
* @return 유저가 존재하는지 여부 반환
*/
public static boolean isUserExist(Map<String, String> map) {
User findUser = UserH2Database.findUserById(map.get("userId"));
return findUser!=null && findUser.getPassword().equals(map.get("password"));
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/file/ViewFile.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package file;

/**
* 리소스 파일의 정보를 저장 (path: 리소스 경로, extension: 확장자)
*/
public class ViewFile {

private final String path;
Expand Down
1 change: 1 addition & 0 deletions src/main/java/model/Article.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package model;

// Article POJO
public class Article {
private String articleId;
private String userId;
Expand Down
Loading

0 comments on commit c82d120

Please sign in to comment.