[Notice] Announcing the End of Demo Server [Read me]
Yi EungJun 2014-06-12
javadoc: Delete comments written in Korean
Almost done but not perfect.
@3f3ba800ebc0ff0130df617a5b77c15562022297
app/Global.java
--- app/Global.java
+++ app/Global.java
@@ -159,11 +159,7 @@
                 Files.write(path, config.getBytes());
             }
 
-            /*
-             * 사이트 관리자 입력 폼 유효성 체크
-             */
             private boolean hasError(Form<User> newUserForm) {
-                // loginId가 빈 값이 들어오면 안된다.
                 if (StringUtils.isBlank(newUserForm.field("loginId").value())) {
                     newUserForm.reject("loginId", "user.wrongloginId.alert");
                 }
@@ -172,22 +168,18 @@
                     newUserForm.reject("loginId", "user.wrongloginId.alert");
                 }
 
-                // password가 빈 값이 들어오면 안된다.
                 if (StringUtils.isBlank(newUserForm.field("password").value())) {
                     newUserForm.reject("password", "user.wrongPassword.alert");
                 }
 
-                // password와 retypedPassword가 일치해야 한다.
                 if (!newUserForm.field("password").value().equals(newUserForm.field("retypedPassword").value())) {
                     newUserForm.reject("retypedPassword", "user.confirmPassword.alert");
                 }
 
-                // email이 빈 값이 들어오면 안된다.
                 if (StringUtils.isBlank(newUserForm.field("email").value())) {
                     newUserForm.reject("email", "validation.invalidEmail");
                 }
 
-                // 중복된 email로 가입할 수 없다.
                 if (User.isEmailExist(newUserForm.field("email").value())) {
                     newUserForm.reject("email", "user.email.duplicate");
                 }
app/actors/PullRequestActor.java
--- app/actors/PullRequestActor.java
+++ app/actors/PullRequestActor.java
@@ -26,17 +26,7 @@
 import models.enumeration.State;
 
 public abstract class PullRequestActor extends UntypedActor {
-    /**
-     * PullRequest 병합을 시도하고 병합결과를 저장한다.
-     *
-     * Diff커밋중 신규커밋이 있을경우 커밋이벤트를 등록한다.
-     * Diff커밋이 없을경우 PullRequest 상태를 병합으로 변경하고 알림과 이벤트를 등록한다.
-     * 병합결과가 충돌일 경우 알림과 이벤트를 등록한다.
-     * 병합결과가 충돌해결일 경우 알림과 이벤트를 등록한다.
-     *
-     * @param message
-     * @param pullRequest
-     */
+
     protected void processPullRequestMerging(PullRequestEventMessage message, PullRequest pullRequest) {
         try {
             String oldMergeCommitId = pullRequest.mergedCommitIdTo;
app/actors/PullRequestMergingActor.java
--- app/actors/PullRequestMergingActor.java
+++ app/actors/PullRequestMergingActor.java
@@ -24,7 +24,6 @@
 import models.PullRequestEventMessage;
 
 /**
- * message로 전달된 pullRequest에 대해 병합을 시도하고 결과를 저장한다.
  * @author Wansoon Park
  *
  */
app/actors/RelatedPullRequestMergingActor.java
--- app/actors/RelatedPullRequestMergingActor.java
+++ app/actors/RelatedPullRequestMergingActor.java
@@ -25,9 +25,6 @@
 import models.PullRequest;
 import models.PullRequestEventMessage;
 
-/**
- * 변경된 branch 와 관련있는 모든 pullRequest 에 대해 병합을 시도하고 결과를 저장한다.
- */
 public class RelatedPullRequestMergingActor extends PullRequestActor {
     @Override
     public void onReceive(Object object) {
@@ -44,10 +41,6 @@
 
     }
 
-    /**
-     * project/branch와 연관된 보낸코드들의 상태를 병합중으로 수정한다.
-     * @param pullRequests
-     */
     private void changeStateToMerging(List<PullRequest> pullRequests) {
         for (PullRequest pullRequest : pullRequests) {
             pullRequest.startMerge();
app/controllers/AbstractPostingApp.java
--- app/controllers/AbstractPostingApp.java
+++ app/controllers/AbstractPostingApp.java
@@ -38,24 +38,15 @@
 
 import java.io.IOException;
 
-/**
- * {@link BoardApp}과 {@link IssueApp}에서 공통으로 사용하는 기능을 담고 있는 컨트롤러 클래스
- */
 public class AbstractPostingApp extends Controller {
     public static final int ITEMS_PER_PAGE = 15;
 
-    /**
-     * 검색 조건
-     */
     public static class SearchCondition {
         public String orderBy;
         public String orderDir;
         public String filter;
         public int pageNum;
 
-        /**
-         * 기본 검색 조건으로 id 역순이며 1페이지를 보여준다.
-         */
         public SearchCondition() {
             this.orderDir = Direction.DESC.direction();
             this.orderBy = "id";
@@ -64,20 +55,6 @@
         }
     }
 
-    /**
-     * 새 댓글 저장 핸들러
-     *
-     * {@code commentForm}에서 입력값을 꺼내 현재 사용자를 작성자로 설정하고 댓글을 저장한다.
-     * 현재 사용자 임시 저장소에 있는 첨부파일을 댓글의 첨부파일로 옮긴다.
-     *
-     *
-     * @param comment
-     * @param commentForm
-     * @param toView
-     * @param containerUpdater
-     * @return
-     * @throws IOException
-     */
     public static Result saveComment(final Comment comment, Form<? extends Comment> commentForm, final Call toView, Runnable containerUpdater) {
         if (commentForm.hasErrors()) {
             flash(Constants.WARNING, "post.comment.empty");
@@ -102,16 +79,6 @@
     }
 
 
-    /**
-     * {@code target}을 삭제하고 {@code redirectTo}로 이동한다.
-     *
-     * when: 게시물이나 이슈 또는 그곳에 달린 댓글을 삭제할 때 사용한다.
-     *
-     * @param target
-     * @param resource
-     * @param redirectTo
-     * @return
-     */
     protected static Result delete(Model target, Resource resource, Call redirectTo) {
         if (!AccessControl.isAllowed(UserApp.currentUser(), resource, Operation.DELETE)) {
             return forbidden(ErrorViews.Forbidden.render("error.forbidden", resource.getProject()));
@@ -119,7 +86,6 @@
 
         target.delete();
 
-        // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다
         if(HttpUtil.isRequestedWithXHR(request())){
             response().setHeader("Location", redirectTo.url());
             return status(204);
@@ -128,22 +94,6 @@
         return redirect(redirectTo);
     }
 
-    /**
-     * {@code posting}에 {@code original} 정보를 채우고 갱신한다.
-     *
-     * when: 게시물이나 이슈를 수정할 떄 사용한다.
-     *
-     * 게시물이나 이슈가 수정될 때 {@code noti} 객체가 null이 아니면 알림을 발송한다.
-     *
-     *
-     *
-     * @param original
-     * @param posting
-     * @param postingForm
-     * @param redirectTo
-     * @param preUpdateHook
-     * @return
-     */
     protected static Result editPosting(AbstractPosting original, AbstractPosting posting, Form<? extends AbstractPosting> postingForm, Call redirectTo, Runnable preUpdateHook) {
         if (postingForm.hasErrors()) {
             return badRequest(ErrorViews.BadRequest.render("error.validation", original.project));
@@ -176,16 +126,6 @@
         return redirect(redirectTo);
     }
 
-    /**
-     * 특정 리소스(게시글이나 댓글)에 사용자가 이전 폼에서 업로드한 임시파일을 첨부시킨다
-     *
-     * when: 이슈등록/수정, 게시판에 글 등록/수정, 댓글쓰기 등에서 업로드한 파일을 해당 리소스에 연결할 때
-     *
-     * {code AttachmentApp.TAG_NAME_FOR_TEMPORARY_UPLOAD_FILES}에 지정된 이름의 input tag에
-     * 업로드한 임시파일의 file id 값이 ,(comma) separator로 구분되어 들어가 있다.
-     *
-     * @param resource 이슈글,게시판글,댓글
-     */
     public static void attachUploadFilesToPost(Resource resource) {
         final String[] temporaryUploadFiles = getTemporaryFileListFromHiddenForm();
         if(isTemporaryFilesExist(temporaryUploadFiles)){
app/controllers/AttachmentApp.java
--- app/controllers/AttachmentApp.java
+++ app/controllers/AttachmentApp.java
@@ -49,30 +49,9 @@
 public class AttachmentApp extends Controller {
 
     public static final String TAG_NAME_FOR_TEMPORARY_UPLOAD_FILES = "temporaryUploadFiles";
-    //사용자 임시 첨부 파일의 서버내 보관시간. 임시파일은 글 작성시 파일은 업로드 한 파일 중 글 작성이 완료 되지 않은 상태의 파일을 말한다.
     public static final long TEMPORARYFILES_KEEPUP_TIME_MILLIS = Configuration.root()
             .getMilliseconds("application.temporaryfiles.keep-up.time", 24 * 60 * 60 * 1000L);
 
-    /**
-     * 사용자 첨부파일로 업로드한다
-     *
-     * when 이슈나 글, 코멘트등에서 파일을 첨부하기 전에 먼저 업로드
-     *
-     * 멀티파트 폼데이터로 파일 업로드 요청을 받아서 서버에 파일 저장을 시도하고
-     * 만약 이미 같은 파일이 서버내에 globally 존재한다면 200OK로 응답
-     * 존재하지 않는 파일이라면 201 created로 응답
-     *
-     * 요청에 첨부파일이 없는 것으로 보일때는 400 Bad Request로 응답
-     * 업로더가 익명 사용자일 경우에는 403 Forbidden 으로 응답
-     *
-     * 업로드된 파일은 그 파일을 업로드한 사용자에게 첨부된 상태가 된다. 이후
-     * {@link Attachment#moveAll(models.resource.Resource, models.resource.Resource)} 등의 메소드를
-     * 사용해서 사용자의 첨부를 이슈 등의 다른 리소스로 옮길 수 있다.
-     *
-     * @return 생성된 파일의 메타데이터를 JSON 타입으로 반환하는 응답
-     * @throws NoSuchAlgorithmException
-     * @throws IOException
-     */
     public static Result uploadFile() throws NoSuchAlgorithmException, IOException {
         // Get the file from request.
         FilePart filePart =
@@ -135,18 +114,6 @@
         }
     }
 
-    /**
-     * {@code id}로 파일을 찾아서 첨부파일로 돌려준다.
-     *
-     * when: 첨부파일을 다운로드 받을 때
-     *
-     * 주의사항: 파일명이 깨지지 않도록 {@link utils.HttpUtil#encodeContentDisposition)}로 인코딩한다.
-     *
-     * @param id 첨부파일 id
-     * @return 파일이 첨부된 응답
-     * @throws NoSuchAlgorithmException
-     * @throws IOException
-     */
     public static Result getFile(Long id) throws IOException {
         Attachment attachment = Attachment.find.byId(id);
         String action = HttpUtil.getFirstValueFromQuery(request().queryString(), "action");
@@ -179,22 +146,6 @@
         return ok(file);
     }
 
-    /**
-     * {@code id}에 해당하는 첨부파일을 지운다.
-     *
-     * 게시물, 이슈, 댓글들의 첨부파일을 지울때 사용한다.
-     *
-     * 폼의 필드에 {@code _method}가 존재하고 값이 delete로 지정되어 있지 않으면 Bad Request로 응답한다.
-     * 파일을 못 찾으면 Not Found
-     * 삭제 권한이 없으면 Forbidden
-     *
-     * 첨부내용을 삭제한 후 해당 첨부의 origin 파일 유효검증
-     *
-     * @param id 첨부파일 id
-     * @return attachment 삭제 결과 (하지만 해당 메시지를 쓰고 있지는 않다. 아까운 네크워크 자원..)
-     * @throws NoSuchAlgorithmException
-     * @throws IOException
-     */
     public static Result deleteFile(Long id) {
         // _method must be 'delete'
         Map<String, String[]> data =
@@ -225,14 +176,6 @@
         }
     }
 
-    /**
-     * origin file의 유효성을 검증하고, 유효하지 않다면 로그를 남긴다.
-     *
-     * origin file이 존재하지 않지만 그 파일을 참조하는 첨부가 존재하는 경우엔 에러 로그를 남긴다.
-     * origin file이 존재하지만 그 파일을 참조하는 첨부가 존재하지 않는 경우엔 경고 로그를 남긴다.
-     *
-     * @param hash origin file의 hash
-     */
     private static void logIfOriginFileIsNotValid(String hash) {
         if (!Attachment.fileExists(hash) && Attachment.exists(hash)) {
             Logger.error("The origin file '" + hash + "' cannot be " +
@@ -247,12 +190,6 @@
         }
     }
 
-    /**
-     * 첨부파일의 메타데이터를 가져온다.
-     *
-     * @param attach 첨부
-     * @return 메타데이터를 맵으로
-     */
     private static Map<String, String> extractFileMetaDataFromAttachementAsMap(Attachment attach) {
         Map<String, String> metadata = new HashMap<>();
 
@@ -265,19 +202,6 @@
         return metadata;
     }
 
-    /**
-     * 파일의 목록을 가져온다.
-     *
-     * 이슈, 게시물, 댓글을 볼 때, 첨부된 파일들의 목록을 보여주기 위해
-     * 이슈, 게시물, 댓글을 편집할 때, 첨부된 파일들의 목록 및 사용자 파일들의 목록을 보여주기 위해
-     *
-     * 로그인한 사용자의 파일들의 목록을 {@code tempFiles} 프로퍼티로 넘겨준다.
-     * 첨부 파일들의 목록을 {@code attachments} 프로퍼티로 넘겨준다.
-     * 첨부 파일들 중 로그인한 사용자가 읽기 권한을 갖지 못한 것이 하나라도 있다면 403 Forbidden 으로 응답한다.
-     *
-     * @return json 포맷으로 된 파일 목록을 본문으로 하는 응답. 다음고 같은 형식이다.
-     *         {@code {tempFiles: 사용자 파일 목록, attachments: 첨부 파일 목록 }}
-     */
     public static Result getFileList() {
         Map<String, List<Map<String, String>>> files =
                 new HashMap<>();
app/controllers/BoardApp.java
--- app/controllers/BoardApp.java
+++ app/controllers/BoardApp.java
@@ -71,19 +71,6 @@
         }
     }
 
-    /**
-     * 게시물 목록 조회
-     *
-     * when: 특정 프로젝트의 게시물 목록을 검색 / 조회 할 때 사용
-     *
-     * 접근 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다.
-     * 검색 조건에 matching 되는 게시물 목록과 공지사항을 가져와서 표시한다.
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param pageNum 페이지 번호
-     * @return
-     */
     @IsAllowed(value = Operation.READ, resourceType = ResourceType.PROJECT)
     public static Result posts(String userName, String projectName, int pageNum) {
         Project project = Project.findByOwnerAndProjectName(userName, projectName);
@@ -103,17 +90,6 @@
         return ok(list.render("menu.board", project, posts, searchCondition, notices));
     }
 
-    /**
-     * 게시물 등록 폼
-     *
-     * when: 새로운 게시물을 작성할 때 사용
-     *
-     * 공지작성 권한이 있다면 등록 폼에서 공지사항 여부 체크 박스를 활성화한다.
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @return
-     */
     @With(AnonymousCheckAction.class)
     @IsCreatable(ResourceType.BOARD_POST)
     public static Result newPostForm(String userName, String projectName) {
@@ -125,17 +101,6 @@
         return ok(create.render("post.new", new Form<>(Posting.class), project, isAllowedToNotice));
     }
 
-    /**
-     * 게시물 등록
-     *
-     * when: 게시물 작성 후 저장시 호출
-     *
-     * 게시물 등록 권한을 확인하여, 권한이 없다면 forbidden 처리한다.
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @return
-     */
     @Transactional
     @IsCreatable(ResourceType.BOARD_POST)
     public static Result newPost(String userName, String projectName) {
@@ -168,21 +133,6 @@
         return redirect(routes.BoardApp.post(project.owner, project.name, post.getNumber()));
     }
 
-    /**
-     * 게시물 조회
-     *
-     * when: 게시물 상세 조회시 호출
-     *
-     * 접근 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다.
-     * 게시물ID에 해당하는 내용이 없다면, 해당하는 게시물이 없음을 알린다.
-     *
-     * ACCEPT 헤더에 json이 있을 경우, POST 내용을 JSON으로 보낸다.
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @return
-     */
     @IsAllowed(value = Operation.READ, resourceType = ResourceType.BOARD_POST)
     public static Result post(String userName, String projectName, Long number) {
         Project project = Project.findByOwnerAndProjectName(userName, projectName);
@@ -201,19 +151,6 @@
         return ok(view.render(post, commentForm, project));
     }
 
-    /**
-     * 게시물 수정 폼
-     *
-     * when: 게시물 수정할때 호출
-     *
-     * 수정 권한을 체크하고 접근 권한이 없다면 forbidden 처리한다.
-     * 공지작성 권한이 있다면 등록 폼에서 공지사항 여부 체크 박스를 활성화한다.
-     *
-     * @param owner 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @return
-     */
     @With(NullProjectCheckAction.class)
     public static Result editPostForm(String owner, String projectName, Long number) {
         Project project = Project.findByOwnerAndProjectName(owner, projectName);
@@ -230,16 +167,6 @@
     }
 
     /**
-     * 게시물 수정
-     *
-     * when: 게시물 수정 후 저장시 호출
-     *
-     * 수정된 내용을 반영하고 게시물 목록 첫 페이지로 돌아간다
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @return
      * @see AbstractPostingApp#editPosting(models.AbstractPosting, models.AbstractPosting, play.data.Form
      */
     @Transactional
@@ -269,16 +196,6 @@
     }
 
     /**
-     * 게시물 삭제
-     *
-     * when: 게시물 삭제시 호출
-     *
-     * 게시물을 삭제하고 게시물 목록 첫 페이지로 돌아간다
-     *
-     * @param owner 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @return
      * @see controllers.AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, play.mvc.Call)
      */
     @Transactional
@@ -292,18 +209,6 @@
     }
 
     /**
-     * 댓글 작성
-     *
-     * when: 게시물에 댓글 작성 후 저장시 호출
-     *
-     * validation check 하여 오류가 있다면 bad request
-     * 작성된 댓글을 저장하고 게시물 상세화면으로 돌아간다
-     *
-     * @param owner 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @return
-     * @throws IOException
      * @see controllers.AbstractPostingApp#saveComment(models.Comment, play.data.Form, play.mvc.Call, Runnable)
      */
     @Transactional
@@ -344,17 +249,6 @@
         };
     }
     /**
-     * 댓글 삭제
-     *
-     * when: 댓글 삭제시 호출
-     *
-     * 댓글을 삭제하고 게시물 상세화면으로 돌아간다
-     *
-     * @param userName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param number 게시물number
-     * @param commentId 댓글ID
-     * @return
      * @see controllers.AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, play.mvc.Call)
      */
     @Transactional
app/controllers/BranchApp.java
--- app/controllers/BranchApp.java
+++ app/controllers/BranchApp.java
@@ -43,15 +43,6 @@
 @IsOnlyGitAvailable
 public class BranchApp extends Controller {
 
-    /**
-     * 저장소에 존재하는 브랜치 목록 표시
-     *
-     * @param loginId
-     * @param projectName
-     * @return
-     * @throws IOException
-     * @throws GitAPIException
-     */
     @IsAllowed(Operation.READ)
     public static Result branches(String loginId, String projectName) throws IOException, GitAPIException {
         Project project = Project.findByOwnerAndProjectName(loginId, projectName);
@@ -71,17 +62,6 @@
         return ok(branches.render(project, allBranches, headBranch));
     }
 
-    /**
-     * 지정한 브랜치를 삭제한다
-     * 삭제한 뒤 브랜치 목록으로 돌아간
-     *
-     * @param loginId
-     * @param projectName
-     * @param branchName
-     * @return
-     * @throws IOException
-     * @throws GitAPIException
-     */
     @IsAllowed(Operation.DELETE)
     public static Result deleteBranch(String loginId, String projectName, String branchName) throws GitAPIException {
         Project project = Project.findByOwnerAndProjectName(loginId, projectName);
@@ -90,14 +70,6 @@
         return redirect(routes.BranchApp.branches(loginId, projectName));
     }
 
-    /**
-     * 지정한 브랜치를 기본 브랜치로 설정한다
-     *
-     * @param loginId
-     * @param projectName
-     * @param branchName
-     * @return
-     */
     @IsAllowed(Operation.UPDATE)
     public static Result setAsDefault(String loginId, String projectName, String branchName) throws IOException, GitAPIException {
         Project project = Project.findByOwnerAndProjectName(loginId, projectName);
app/controllers/CodeApp.java
--- app/controllers/CodeApp.java
+++ app/controllers/CodeApp.java
@@ -53,12 +53,6 @@
 public class CodeApp extends Controller {
     public static String hostName;
 
-    /**
-     * 기본 코드 브라우저 표시
-     *
-     * @param userName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     */
     @IsAllowed(Operation.READ)
     public static Result codeBrowser(String userName, String projectName)
             throws IOException, UnsupportedOperationException, ServletException {
@@ -70,7 +64,6 @@
 
         PlayRepository repository = RepositoryService.getRepository(project);
 
-        // GIT 저장소이면서 브랜치가 하나도 없는 경우 NOHEAD 안내문 표시
         if(repository.isEmpty()) {
             switch (project.vcs) {
                 case RepositoryService.VCS_GIT:
@@ -90,14 +83,6 @@
         return redirect(routes.CodeApp.codeBrowserWithBranch(userName, projectName, defaultBranch, ""));
     }
 
-    /**
-     * 브랜치, 파일 경로를 인자로 받는 코드 브라우저 표시
-     *
-     * @param userName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param branch 브랜치 이름
-     * @param path 파일 경로
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result codeBrowserWithBranch(String userName, String projectName, String branch, String path)
         throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException {
@@ -117,7 +102,6 @@
         List<ObjectNode> recursiveData = new ArrayList<>();
         List<String> branches = repository.getBranches();
 
-        /** 해당 경로가 폴더이고 최상위가 아니면, 최상위 경로부터 순서대로 정보를 추가한다 **/
         if(fileInfo.get("type").getTextValue().equals("folder") && !path.equals("")){
             recursiveData.addAll(RepositoryService.getMetaDataFromAncestorDirectories(repository, branch, path));
         }
@@ -126,13 +110,6 @@
         return ok(view.render(project, branches, recursiveData, branch, path));
     }
 
-    /**
-     * AJAX 호출로 지정한 프로젝트 지정한 경로의 정보를 얻고자 할 때 사용된다
-     *
-     * @param userName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param path 파일 또는 폴더의 경로
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result ajaxRequest(String userName, String projectName, String path) throws Exception{
         PlayRepository repository = RepositoryService.getRepository(userName, projectName);
@@ -145,14 +122,6 @@
         }
     }
 
-    /**
-     * AJAX 호출로 지정한 프로젝트의 특정 브랜치에서 지정한 경로의 정보를 얻고자 할 때 사용된다
-     *
-     * @param userName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param branch 브랜치 이름
-     * @param path 파일 또는 폴더의 경로
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result ajaxRequestWithBranch(String userName, String projectName, String branch, String path)
             throws UnsupportedOperationException, IOException, SVNException, GitAPIException, ServletException{
@@ -167,14 +136,6 @@
         }
     }
 
-    /**
-     * 지정한 프로젝트의 지정한 파일의 원본을 보여준다
-     *
-     * @param userName
-     * @param projectName
-     * @param revision
-     * @param path
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result showRawFile(String userName, String projectName, String revision, String path) throws Exception{
         byte[] fileAsRaw = RepositoryService.getFileAsRaw(userName, projectName, revision, path);
@@ -193,13 +154,6 @@
         return ok(fileAsRaw).as(mediaTypeString);
     }
 
-    /**
-     * 지정판 프로젝트의 지정한 이미지 파일 원본을 보여준다
-     *
-     * @param userName
-     * @param projectName
-     * @param path
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result showImageFile(String userName, String projectName, String revision, String path) throws Exception{
         final byte[] fileAsRaw = RepositoryService.getFileAsRaw(userName, projectName, revision, path);
@@ -209,13 +163,6 @@
 
     private static Tika tika = new Tika();
 
-    /**
-     * 프로젝트의 저장소 URL을 반환하는 함수
-     * 화면에 저장소 URL을 표시하기 위해 사용된다
-     *
-     * @param ownerName
-     * @param projectName
-     */
     public static String getURL(String ownerName, String projectName) {
         Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
         return getURL(project);
@@ -233,13 +180,6 @@
         }
     }
 
-    /**
-     * 현재 로그인 된 사용자 정보가 있으면
-     * 프로젝트 저장소 URL에 사용자 ID를 포함해서 반환한다
-     * 예: protocol://user@host.name/path
-     *
-     * @param project
-     */
     public static String getURLWithLoginId(Project project) {
         String url = getURL(project);
         if(url != null) {
@@ -251,13 +191,6 @@
         return url;
     }
 
-     /**
-     * 지정한 프로젝트의 지정한 파일을 연다.
-     *
-     * @param userName
-     * @param revision
-     * @param path
-     */
     @IsAllowed(Operation.READ)
     public static Result openFile(String userName, String projectName, String revision,
                            String path) throws Exception{
app/controllers/CodeHistoryApp.java
--- app/controllers/CodeHistoryApp.java
+++ app/controllers/CodeHistoryApp.java
@@ -61,23 +61,6 @@
     private static final int HISTORY_ITEM_LIMIT = 25;
 
 
-    /**
-     * 코드 저장소의 커밋 로그 목록 페이지에 대한 요청에 응답한다.
-     *
-     * when: 코드 메뉴의 커밋 탭을 클릭했을 때
-     *
-     * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, HEAD 까지의 커밋
-     * 목록에 대한 페이지로 응답한다. 브랜치는 선택하지 않은 것으로 간주한다.
-     *
-     * @param ownerName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @return 커밋 로그 목록 HTML 페이지를 담은 응답
-     * @throws IOException
-     * @throws UnsupportedOperationException
-     * @throws ServletException
-     * @throws GitAPIException
-     * @throws SVNException
-     */
     @With(DefaultProjectCheckAction.class)
     public static Result historyUntilHead(String ownerName, String projectName) throws IOException,
             UnsupportedOperationException, ServletException, GitAPIException,
@@ -85,27 +68,6 @@
         return history(ownerName, projectName, null, null);
     }
 
-    /**
-     * 코드 저장소의 특정 {@code branch}에 대한 커밋 로그 목록 페이지에 대한 요청에 응답한다.
-     *
-     * when: 코드 메뉴의 커밋 탭에서 특정 브랜치를 선택했을 때
-     *
-     * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, 지정한
-     * {@code branch}의 커밋 목록 중, 한 페이지의 크기를 {@link #HISTORY_ITEM_LIMIT}로 했을 때
-     * {@code page}(요청의 쿼리에서 얻음)번째 페이지를 응답 메시지에 담아 반환한다.
-     *
-     * 만약 HEAD가 존재하지 않는 경우에는, 저장소를 만들어야 한다는 안내 페이지로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param branch 선택한 브랜치
-     * @return 커밋 로그 목록 HTML 페이지를 담은 응답
-     * @throws IOException
-     * @throws UnsupportedOperationException
-     * @throws ServletException
-     * @throws GitAPIException
-     * @throws SVNException
-     */
     @IsAllowed(Operation.READ)
     public static Result history(String ownerName, String projectName, String branch, String path) throws IOException,
             UnsupportedOperationException, ServletException, GitAPIException,
@@ -132,24 +94,6 @@
         }
     }
 
-    /**
-     * 코드 저장소의 특정 커밋을 보여달라는 요청에 응답한다.
-     *
-     * when: 코드 메뉴의 커밋 탭에서, 커밋의 목록 중 특정 커밋을 클릭했을 때
-     *
-     * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에서, 지정한
-     * {@code commitId}에 해당하는 커밋과 그 부모 커밋과의 차이를 HTML 페이지로 렌더링하여 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자
-     * @param projectName 프로젝트 이름
-     * @param commitId 커밋 아이디
-     * @return 특정 커밋을 보여주는 HTML 페이지를 담은 응답
-     * @throws IOException
-     * @throws UnsupportedOperationException
-     * @throws ServletException
-     * @throws GitAPIException
-     * @throws SVNException
-     */
     @IsAllowed(Operation.READ)
     public static Result show(String ownerName, String projectName, String commitId)
             throws IOException, UnsupportedOperationException, ServletException, GitAPIException,
app/controllers/EnrollProjectApp.java
--- app/controllers/EnrollProjectApp.java
+++ app/controllers/EnrollProjectApp.java
@@ -32,20 +32,9 @@
 import play.mvc.Result;
 import play.mvc.With;
 
-/**
- * 프로젝트에 멤버로 등록해달라는 요청을 처리하는 컨트롤러
- */
 @With(AnonymousCheckAction.class)
 public class EnrollProjectApp extends Controller {
 
-    /**
-     * {@code loginId}의 {@code proejctName}에 해당하는 프로젝트에
-     * 멤버 등록 요청을 생성합니다.
-     *
-     * @param loginId
-     * @param projectName
-     * @return
-     */
     @Transactional
     @With(DefaultProjectCheckAction.class)
     public static Result enroll(String loginId, String projectName) {
@@ -64,14 +53,6 @@
         return ok();
     }
 
-    /**
-     * {@code loginId}의 {@code proejctName}에 해당하는 프로젝트에
-     * 멤버 등록 요청을 취소한다.
-     *
-     * @param loginId
-     * @param proejctName
-     * @return
-     */
     @Transactional
     @With(DefaultProjectCheckAction.class)
     public static Result cancelEnroll(String loginId, String proejctName) {
app/controllers/GitApp.java
--- app/controllers/GitApp.java
+++ app/controllers/GitApp.java
@@ -37,37 +37,11 @@
 
 public class GitApp extends Controller {
 
-    /**
-     * 주어진 {@code service}가 지원되는지의 여부를 반환한다.
-     *
-     * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때
-     *
-     * "git-upload-pack"과 "git-receive-pack" 서비스만을 지원한다.
-     *
-     * @param service 지원되는지 물어볼 서비스
-     * @return {@code service}가 지원되는지의 여부
-     */
     public static boolean isSupportedService(String service) {
         return service != null
                 && (service.equals("git-upload-pack") || service.equals("git-receive-pack"));
     }
 
-    /**
-     * {@code project}의 Git 저장소에 대해 현재 사용자가 {@code service}를 요청할 권한이 있는지의 여부를
-     * 반환한다.
-     *
-     * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때
-     *
-     * "git-upload-pack" 서비스의 경우, 저장소에 읽기({@link Operation#READ}) 권한이 있는지, 그 외의
-     * 서비스의 경우, 저장소에 갱신({@link Operation#UPDATE} 권한이 있는지 검사한다.
-     *
-     * @param project Git 저장소가 속한 프로젝트
-     * @param service 수행할 권한이 있는지 물어볼 서비스
-     * @return 권한이 있는지의 여부
-     * @throws UnsupportedOperationException
-     * @throws IOException
-     * @throws ServletException
-     */
     private static boolean isAllowed(Project project, String service) throws
             UnsupportedOperationException, IOException, ServletException {
         Operation operation = Operation.UPDATE;
@@ -81,23 +55,6 @@
 
     }
 
-    /**
-     * Git 서버에 대한 {@code service} 요청을 처리한다.
-     *
-     * when: Git 클라이언트가 Git 서버에 서비스 요청을 했을 때
-     *
-     * {@code ownerName}과 {@code projectName}에 대응하는 프로젝트의 코드 저장소에 대해,
-     * {@code service} 요청을 수행하고 그 결과를 응답으로 돌려준다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param service 요청하는 서비스
-     * @param isAdvertise advertise에 대한 요청인지의 여부
-     * @return 요청에 대한 응답
-     * @throws IOException
-     * @throws UnsupportedOperationException
-     * @throws ServletException
-     */
     public static Result service(String ownerName, String projectName, String service,
             boolean isAdvertise) throws IOException, UnsupportedOperationException,
             ServletException {
@@ -142,25 +99,6 @@
         }
     }
 
-    /**
-     * Git 서버에 대한 advertise 요청을 처리한다.
-     *
-     * when: Git 클라이언트가 Git 서버에 advertise 요청을 했을 때
-     *
-     * 요청을 처리하기 전에, {@link BasicAuthAction}으로 사용자를 인증한다.
-     *
-     * {@code service}가 주어지지 않은 경우에는 본래 getanyfile 서비스를 수행해야 하나, 현재 지원하지
-     * 않으므로 403 Forbidden 으로 응답한다. 이는 Git의 {@code http-backend.c}가 동작하는 방식을 그대로
-     * 따른 것이다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param service 요청하는 서비스
-     * @return 요청에 대한 응답
-     * @throws UnsupportedOperationException
-     * @throws IOException
-     * @throws ServletException
-     */
     @With(BasicAuthAction.class)
     public static Result advertise(String ownerName, String projectName, String service)
             throws UnsupportedOperationException, IOException, ServletException {
@@ -172,23 +110,6 @@
         return GitApp.service(ownerName, projectName, service, true);
     }
 
-    /**
-     * Git 서버에 대한 RPC 요청을 처리한다.
-     *
-     * when: Git 클라이언트가 Git 서버에 RPC 요청을 했을 때
-     *
-     * RPC 요청시의 {@code service}는 "git-upload-pack"과 "git-receive-pack" 뿐이며, 이외의 경우는 없다.
-     *
-     * 요청을 처리하기 전에, {@link BasicAuthAction}으로 사용자를 인증한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param service 요청하는 서비스
-     * @return 요청에 대한 응답
-     * @throws UnsupportedOperationException
-     * @throws IOException
-     * @throws ServletException
-     */
     @With(BasicAuthAction.class)
     public static Result serviceRpc(String ownerName, String projectName, String service)
             throws UnsupportedOperationException, IOException, ServletException {
app/controllers/ImportApp.java
--- app/controllers/ImportApp.java
+++ app/controllers/ImportApp.java
@@ -52,23 +52,12 @@
 
 public class ImportApp extends Controller {
 
-    /**
-     * Git repository에서 코드를 가져와서 프로젝트를 만드는 폼을 보여준다.
-     *
-     * @return
-     */
     @With(AnonymousCheckAction.class)
     public static Result importForm() {
         List<OrganizationUser> orgUserList = OrganizationUser.findByAdmin(UserApp.currentUser().id);
         return ok(importing.render("title.newProject", form(Project.class), orgUserList));
     }
 
-    /**
-     * 새 프로젝트 시작 폼에 추가로 Git 저장소 URL을 추가로 입력받고
-     * 해당 저장소를 clone하여 프로젝트의 Git 저장소를 생성한다.
-     *
-     * @return
-     */
     @Transactional
     public static Result newProject() throws GitAPIException, IOException {
         if( !AccessControl.isGlobalResourceCreatable(UserApp.currentUser()) ){
app/controllers/IssueApp.java
--- app/controllers/IssueApp.java
+++ app/controllers/IssueApp.java
@@ -57,20 +57,6 @@
     private static final String EXCEL_EXT = "xls";
     private static final Integer ITEMS_PER_PAGE_MAX = 45;
 
-    /**
-     * 내 이슈 목록 조회
-     *
-     * <p>when: 자신의 이슈만 검색하고 싶을때</p>
-     *
-     * 입력된 검색 조건이 있다면 적용하고 페이징 처리된 목록을 보여준다.
-     *
-     * @param state 이슈 상태 (해결 / 미해결)
-     * @param format 요청 형식
-     * @param pageNum 페이지 번호
-     * @return
-     * @throws WriteException
-     * @throws IOException
-     */
     @With(AnonymousCheckAction.class)
     public static Result userIssues(String state, String format, int pageNum) throws WriteException, IOException {
         Project project = null;
@@ -111,24 +97,6 @@
         return searchCondition.assigneeId == null && searchCondition.authorId == null && searchCondition.mentionId == null;
     }
 
-    /**
-     * 이슈 목록 조회
-     *
-     * <p>when: 프로젝트의 이슈 목록 진입, 이슈 검색</p>
-     *
-     * 현재 사용자가 프로젝트에 권한이 없다면 Forbidden 으로 응답한다.
-     * 입력된 검색 조건이 있다면 적용하고 페이징 처리된 목록을 보여준다.
-     * 요청 형식({@code format})이 엑셀(xls)일 경우 목록을 엑셀로 다운로드한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param state 이슈 상태 (해결 / 미해결)
-     * @param format 요청 형식
-     * @param pageNum 페이지 번호
-     * @return
-     * @throws WriteException
-     * @throws IOException
-     */
     @IsAllowed(Operation.READ)
     public static Result issues(String ownerName, String projectName, String state, String format, int pageNum) throws WriteException, IOException {
         Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
@@ -164,13 +132,6 @@
         }
     }
 
-    /**
-     * 한 페이지에 표시할 항목의 갯수를 반환한다
-     * GET 쿼리로 itemsPerPage 가 있으면 그것을 활용하고,
-     * 기본값은 ITEMS_PER_PAGE 상수를 사용한다
-     * 최대값인 ITEMS_PER_PAGE_MAX 를 넘을수는 없다
-     * @return
-     */
     private static Integer getItemsPerPage(){
         Integer itemsPerPage = ITEMS_PER_PAGE;
         String amountStr = request().getQueryString("itemsPerPage");
@@ -184,15 +145,6 @@
         return Math.min(itemsPerPage, ITEMS_PER_PAGE_MAX);
     }
 
-    /**
-     * 이슈 목록을 HTML 페이지로 반환
-     * issues() 에서 기본값으로 호출된다
-     *
-     * @param project 프로젝트
-     * @param issues 이슈 목록 페이지
-     * @param searchCondition 검색 조건
-     * @return
-     */
     private static Result issuesAsHTML(Project project, Page<Issue> issues, models.support.SearchCondition searchCondition){
         if(project == null){
             return ok(my_list.render("title.issueList", issues, searchCondition, project));
@@ -202,16 +154,6 @@
 
     }
 
-    /**
-     * 이슈 목록을 Microsoft Excel 형식으로 반환
-     * issues() 에서 요청 형식({@code format})이 엑셀(xls)일 경우 호출된다
-     *
-     * @param project 프로젝트
-     * @param el
-     * @throws WriteException
-     * @throws IOException
-     * @return
-     */
     private static Result issuesAsExcel(Project project, ExpressionList<Issue> el) throws WriteException, IOException {
         byte[] excelData = Issue.excelFrom(el.findList());
         String filename = HttpUtil.encodeContentDisposition(
@@ -223,15 +165,6 @@
         return ok(excelData);
     }
 
-    /**
-     * 이슈 목록을 PJAX 용으로 응답한다
-     * issuesAsHTML()과 거의 같지만 캐시하지 않고 partial_search 로 렌더링한다는 점이 다르다
-     *
-     * @param project
-     * @param issues
-     * @param searchCondition
-     * @return
-     */
     private static Result issuesAsPjax(Project project, Page<Issue> issues, models.support.SearchCondition searchCondition) {
         response().setHeader("Cache-Control", "no-cache, no-store");
         if (project == null) {
@@ -242,22 +175,9 @@
 
     }
 
-    /**
-     * 이슈 목록을 정해진 갯수만큼 JSON으로 반환한다
-     * QueryString 으로 목록에서 제외할 이슈ID (exceptId) 를 지정할 수 있고
-     * 반환하는 갯수는 ITEMS_PER_PAGE
-     *
-     * 이슈 작성/수정시 비슷할 수 있는 이슈 표현을 위해 XHR 이슈 검색시 사용된다
-     *
-     * @param project
-     * @param issues
-     * @return
-     */
     private static Result issuesAsJson(Project project, Page<Issue> issues) {
         ObjectNode listData = Json.newObject();
 
-        // 반환할 목록에서 제외할 이슈ID 를 exceptId 로 지정할 수 있다(QueryString)
-        // 이슈 수정시 '비슷할 수 있는 이슈' 목록에서 현재 수정중인 이슈를 제외하기 위해 사용한다
         String exceptIdStr = request().getQueryString("exceptId");
         Long exceptId = -1L;
 
@@ -269,7 +189,7 @@
             }
         }
 
-        List<Issue> issueList = issues.getList(); // the list of entities for this page
+        List<Issue> issueList = issues.getList();
 
         for (Issue issue : issueList){
             Long issueId = issue.getNumber();
@@ -290,19 +210,6 @@
         return ok(listData);
     }
 
-    /**
-     * 이슈 조회
-     *
-     * <p>when: 단일 이슈의 상세내용 조회</p>
-     *
-     * 접근 권한이 없을 경우, Forbidden 으로 응답한다.
-     * 조회하려는 이슈가 존재하지 않을 경우엔 NotFound 로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     */
     @With(NullProjectCheckAction.class)
     public static Result issue(String ownerName, String projectName, Long number) {
         Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
@@ -348,19 +255,6 @@
         }
     }
 
-    /**
-     * 이슈 타임라인 조회
-     *
-     * <p>when: 단일 이슈의 타임라인 조회</p>
-     *
-     * 접근 권한이 없을 경우, Forbidden 으로 응답한다.
-     * 조회하려는 이슈가 존재하지 않을 경우엔 NotFound 로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     */
     @IsAllowed(resourceType = ResourceType.ISSUE_POST, value = Operation.READ)
     public static Result timeline(String ownerName, String projectName, Long number) {
         Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
@@ -373,15 +267,6 @@
         return ok(partial_comments.render(project, issueInfo));
     }
 
-    /**
-     * 새 이슈 등록 폼
-     *
-     * <p>when: 새로운 이슈 작성</p>
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @return
-     */
     @With(AnonymousCheckAction.class)
     @IsCreatable(ResourceType.ISSUE_POST)
     public static Result newIssueForm(String ownerName, String projectName) {
@@ -389,21 +274,6 @@
         return ok(create.render("title.newIssue", new Form<>(Issue.class), project));
     }
 
-    /**
-     * 여러 이슈를 한번에 갱신하려는 요청에 응답한다.
-     *
-     * <p>when: 이슈 목록 페이지에서 이슈를 체크하고 상단의 갱신 드롭박스를 이용해 체크한 이슈들을 갱신할 때</p>
-     *
-     * 갱신을 시도한 이슈들 중 하나 이상 갱신에 성공했다면 이슈 목록 페이지로 리다이렉트한다. (303 See Other)
-     * 어떤 이슈에 대한 갱신 요청이든 모두 실패했으며, 그 중 권한 문제로 실패한 것이 한 개 이상 있다면 403
-     * Forbidden 으로 응답한다.
-     * 갱신 요청이 잘못된 경우엔 400 Bad Request 로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @return
-     * @throws IOException
-     */
     @Transactional
     @With(NullProjectCheckAction.class)
     public static Result massUpdate(String ownerName, String projectName) {
@@ -510,21 +380,6 @@
         }
     }
 
-    /**
-     * 새 이슈 등록
-     *
-     * <p>when: 새 이슈 등록 폼에서 저장</p>
-     *
-     * 이슈 생성 권한이 없다면 Forbidden 으로 응답한다.
-     * 입력 폼에 문제가 있다면 BadRequest 로 응답한다.
-     * 이슈 저장전에 임시적으로 사용자에게 첨부되었던 첨부파일들을 이슈 하위로 옮긴다,
-     * 저장 이후 목록 화면으로 돌아간다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @return
-     * @throws IOException
-     */
     @Transactional
     @IsCreatable(ResourceType.ISSUE_POST)
     public static Result newIssue(String ownerName, String projectName) {
@@ -576,18 +431,6 @@
         return issue.assignee != null;
     }
 
-    /**
-     * 이슈 수정 폼
-     *
-     *  <p>when: 기존 이슈 수정</p>
-     *
-     *  이슈 수정 권한이 없을 경우 Forbidden 으로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     */
     @With(NullProjectCheckAction.class)
     public static Result editIssueForm(String ownerName, String projectName, Long number) {
         Project project = Project.findByOwnerAndProjectName(ownerName, projectName);
@@ -602,20 +445,6 @@
         return ok(edit.render("title.editIssue", editForm, issue, project));
     }
 
-    /**
-     * 이슈 상태 전이
-     *
-     * <p>when: 특정 이슈를 다음 상태로 전이시킬 때</p>
-     *
-     * OPEN 된 이슈의 다음 상태는 CLOSED가 된다.
-     * 단, CLOSED 된 상태의 이슈를 다음 상태로 전이시키면 OPEN 상태가 된다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     * @throws IOException
-     */
     @Transactional
     @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.ISSUE_POST)
     public static Result nextState(String ownerName, String projectName, Long number) {
@@ -655,22 +484,6 @@
         }
     }
 
-    /**
-     * 이슈 수정
-     *
-     * <p>when: 이슈 수정 폼에서 저장</p>
-     *
-     * 폼에서 전달 받은 내용, 마일스톤, 라벨 정보와
-     * 기존 이슈에 작성되어 있던 댓글 정보를 정리하여 저장한다.
-     * 저장후 목록 화면으로 돌아간다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     * @throws IOException
-     * @see {@link AbstractPostingApp#editPosting}
-     */
     @With(NullProjectCheckAction.class)
     public static Result editIssue(String ownerName, String projectName, Long number) {
         Form<Issue> issueForm = new Form<>(Issue.class).bindFromRequest();
@@ -710,9 +523,6 @@
         return editPosting(originalIssue, issue, issueForm, redirectTo, preUpdateHook);
     }
 
-    /*
-     * form 에서 전달받은 마일스톤ID를 이용해서 이슈객체에 마일스톤 객체를 set한다
-     */
     private static void setMilestone(Form<Issue> issueForm, Issue issue) {
         String milestoneId = issueForm.data().get("milestoneId");
         if(milestoneId != null && !milestoneId.isEmpty()) {
@@ -723,16 +533,6 @@
     }
 
     /**
-     * 이슈 삭제
-     *
-     * <p>when: 이슈 조회화면에서 삭제</p>
-     *
-     * 이슈 번호에 해당하는 이슈 삭제 후 이슈 목록 화면으로 돌아간다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
      * @ see {@link AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, Call)}
      */
     @Transactional
@@ -750,17 +550,6 @@
     }
 
     /**
-     * 댓글 작성
-     *
-     * <p>when: 이슈 조회화면에서 댓글 작성하고 저장</p>
-     *
-     * 현재 사용자를 댓글 작성자로 하여 저장하고 이슈 조회화면으로 돌아간다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param number 이슈 번호
-     * @return
-     * @throws IOException
      * @see {@link AbstractPostingApp#newComment(models.Comment, play.data.Form}
      */
     @Transactional
@@ -840,18 +629,6 @@
 
 
     /**
-     * 댓글 삭제
-     *
-     * <p>when: 댓글 삭제 버튼</p>
-     *
-     * 댓글을 삭제하고 이슈 조회 화면으로 돌아간다.
-     * 삭제 권한이 없을 경우 Forbidden 으로 응답한다.
-     *
-     * @param ownerName 프로젝트 소유자 이름
-     * @param projectName 프로젝트 이름
-     * @param issueNumber 이슈 번호
-     * @param commentId 댓글ID
-     * @return
      * @see {@link AbstractPostingApp#delete(play.db.ebean.Model, models.resource.Resource, Call)}
      */
     @Transactional
@@ -866,17 +643,6 @@
         return delete(comment, comment.asResource(), redirectTo);
     }
 
-    /**
-     * 이슈 라벨 구성
-     *
-     * <p>when: 새로 이슈를 작성하거나, 기존 이슈를 수정할때</p>
-     *
-     * {@code request} 에서 이슈 라벨 ID들을 추출하여 이에 대응하는 이슈라벨 정보들을
-     * {@code labels} 에 저장한다.
-     *
-     * @param labels 이슈 라벨을 저장할 대상
-     * @param request 요청 정보 (이슈라벨 ID를 추출하여 사용한다)
-     */
     private static void addLabels(Issue issue, Http.Request request) {
         if (issue.labels == null) {
             issue.labels = new HashSet<>();
app/controllers/LabelApp.java
--- app/controllers/LabelApp.java
+++ app/controllers/LabelApp.java
@@ -39,25 +39,7 @@
     private static final int MAX_FETCH_LABELS = 1000;
 
     /**
-     * 태그 목록 요청에 대해 응답한다.
-     *
-     * when: 프로젝트 Overview 페이지에서 사용자가 태그를 추가하려고 할 때, 이름 자동완성을 위해 사용한다.
-     *
-     * 주어진 {@code query}로 태그를 검색하여, 그 목록을 json 형식으로 돌려준다.
-     *
-     * 돌려줄 태그 목록의 갯수가, {@link LabelApp#MAX_FETCH_LABELS}와 주어진 {@code limit}중에서 가장 작은 값보다
-     * 크다면, 그 값에 의해 제한된다. 만약 제한이 되었다면, 응답의 @{code Content-Range}헤더로 어떻게 제한이
-     * 되었는지에 대한 정보를 클라이언트에게 전달하게 된다. 예를 들어 10개 중에 8개만을 보내게 되었다면
-     * @{code Content-Range: 8/10}이 된다. 자세한 것은 label-typeahead.md 문서의 "Content-Range 헤더" 문단을
-     * 참조하라.
-     *
-     * 다음의 경우에는 {@code 406 Not Acceptable}로 응답한다.
-     * 클라이언트가 {@code application/json}을 받아들일 수 없는 경우. 태그 목록 요청에 대한 성공적인 응답에서,
-     * 엔터티 본문의 미디어 타입은 언제나 {@code application/json}이기 때문이다.
-     *
-     * @param query 태그에 대한 검색어 질의
-     * @param limit 가져올 태그의 최대 갯수
-     * @return 태그 목록 요청에 대한 응답
+     * @param category a group of label to search
      * @see <a href="https://github.com/nforge/yobi/blob/master/docs/technical/label-typeahead
      * .md>label-typeahead.md</a>
      */
app/controllers/MilestoneApp.java
--- app/controllers/MilestoneApp.java
+++ app/controllers/MilestoneApp.java
@@ -47,9 +47,6 @@
 
 import static play.data.Form.form;
 
-/**
- * 마일스톤 관리
- */
 public class MilestoneApp extends Controller {
 
     public static class MilestoneCondition {
@@ -65,15 +62,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트의 마일스톤 목록을 조회한다.
-     *
      * when: GET /:user/:project/milestones
-     *
-     * {@link MilestoneCondition} 폼에서 입력받은 값으로 기본 검색 조건 및 정렬 조건을 적용한다.
-     *
-     * @param userName
-     * @param projectName
-     * @return
      */
     @IsAllowed(Operation.READ)
     public static Result milestones(String userName, String projectName) {
@@ -89,16 +78,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * 새 마일스톤을 추가할 수 있는 입력 폼으로 이동한다.
-     *
      * when: GET /:user/:project/newMilestoneForm
-     *
-     * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다.
-     *
-     * @param userName
-     * @param projectName
-     * @return
      */
     @With(AnonymousCheckAction.class)
     @IsCreatable(ResourceType.MILESTONE)
@@ -108,19 +88,8 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * 새 마일스톤을 추가한다.
-     *
      * when: POST /:user/:project/milestones
      *
-     * {@link Milestone} 폼으로 입력받은 데이터를 사용해서 새 마일스톤을 생성한다.
-     * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다.
-     * 같은 이름을 가진 마일스톤이 있는지 확인한다.
-     * 같은 이름을 가진 마일스톤이 있을 경우 새 마일스톤 입력 폼으로 다시 이동한다.
-     *
-     * @param userName
-     * @param projectName
-     * @return
      * @see {@link #validate(models.Project, play.data.Form)}
      */
     @Transactional
@@ -147,14 +116,6 @@
         }
     }
 
-    /**
-     * {@code project}에 동일한 이름을 가진 마일스톤이 있는지 확인한다.
-     *
-     * 동일한 이름을 가진 마일스톤이 있을 경우 마일스톤 이름 중복 에러 메시지를 플래시 스코프에 담는다.
-     *
-     * @param project
-     * @param milestoneForm
-     */
     private static void validate(Project project, Form<Milestone> milestoneForm) {
         if (!Milestone.isUniqueProjectIdAndTitle(project.id, milestoneForm.field("title").value())) {
             milestoneForm.reject("title", "milestone.title.duplicated");
@@ -163,17 +124,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤 수정 화면으로 이동한다.
-     *
      * when: GET /:user/:project/milestone/:id/editform
-     *
-     * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다.
-     *
-     * @param userName
-     * @param projectName
-     * @param milestoneId
-     * @return
      */
     @With(AnonymousCheckAction.class)
     @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE)
@@ -186,18 +137,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤을 갱신한다.
-     *
      * when: POST /:user/:project/milestone/:id/edit
-     *
-     * 마일스톤 이름을 변경한 경우에는 이름이 중복되는지 확인한다.
-     * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다.
-     *
-     * @param userName
-     * @param projectName
-     * @param milestoneId
-     * @return
      */
     @Transactional
     @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE)
@@ -227,19 +167,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤을 삭제한다.
-     *
      * when: GET /:user/:project/milestone/:id/delete
-     *
-     * 해당 프로젝트를 찾지 못할 때는 {@link #notFound()}를 반환한다.
-     * 프로젝트의 아이디와 마일스톤이 가지고 있는 프로젝트 레퍼런스의 아이디가 다를 경우에
-     * {@link #internalServerError()}를 반환한다.
-     *
-     * @param userName
-     * @param projectName
-     * @param id
-     * @return
      */
     @Transactional
     @IsAllowed(value = Operation.DELETE, resourceType = ResourceType.MILESTONE)
@@ -252,7 +180,6 @@
         }
         milestone.delete();
 
-        // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다
         if(HttpUtil.isRequestedWithXHR(request())){
             response().setHeader("Location", routes.MilestoneApp.milestones(userName, projectName).toString());
             return status(204);
@@ -261,15 +188,6 @@
         return redirect(routes.MilestoneApp.milestones(userName, projectName));
     }
 
-    /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤을 미해결 상태로 변경한다.
-     *
-     * @param userName
-     * @param projectName
-     * @param id
-     * @return
-     */
     @Transactional
     @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE)
     public static Result open(String userName, String projectName, Long id) {
@@ -278,15 +196,6 @@
         return redirect(routes.MilestoneApp.milestone(userName, projectName, id));
     }
 
-    /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤을 해결 상태로 변경한다.
-     *
-     * @param userName
-     * @param projectName
-     * @param id
-     * @return
-     */
     @Transactional
     @IsAllowed(value = Operation.UPDATE, resourceType = ResourceType.MILESTONE)
     public static Result close(String userName, String projectName, Long id) {
@@ -296,15 +205,7 @@
     }
 
     /**
-     * {@code userName}과 {@code projectName}에 해당하는 프로젝트에
-     * {@code milestoneId}에 해당하는 마일스톤 상세 정보를 조회한다.
-     *
      * when: GET /:user/:project/milestone/:id
-     *
-     * @param userName
-     * @param projectName
-     * @param id
-     * @return
      */
     @IsAllowed(value = Operation.READ, resourceType = ResourceType.MILESTONE)
     public static Result milestone(String userName, String projectName, Long id) {
app/controllers/OrganizationApp.java
--- app/controllers/OrganizationApp.java
+++ app/controllers/OrganizationApp.java
@@ -92,19 +92,16 @@
     }
 
     private static void validate(Form<Organization> newOrgForm) {
-        // 조직 이름 패턴을 검사한다.
         Set<ConstraintViolation<Organization>> results = Validation.getValidator().validate(newOrgForm.get());
         if (!results.isEmpty()) {
             newOrgForm.reject("name", "organization.name.alert");
         }
 
         String name = newOrgForm.field("name").value();
-        // 중복된 loginId로 가입할 수 없다.
         if (User.isLoginIdExist(name)) {
             newOrgForm.reject("name", "organization.name.duplicate");
         }
 
-        // 같은 이름의 조직을 만들 수 없다.
         if (Organization.isNameExist(name)) {
             newOrgForm.reject("name", "organization.name.duplicate");
         }
@@ -123,12 +120,6 @@
         return ok(view.render(org));
     }
 
-    /**
-     * 그룹에 멤버를 추가한다.
-     *
-     * @param organizationName
-     * @return
-     */
     @Transactional
     public static Result addMember(String organizationName) {
         Form<User> addMemberForm = form(User.class).bindFromRequest();
@@ -146,13 +137,6 @@
         return redirect(routes.OrganizationApp.members(organizationName));
     }
 
-    /**
-     * {@link #addMember(String)}를 위해 사용되는 변수의 유효성 검사를 한다.
-     *
-     * @param addMemberForm
-     * @param organizationName
-     * @return
-     */
     private static Result validateForAddMember(Form<User> addMemberForm, String organizationName) {
         String userLoginId = addMemberForm.get().loginId;
         User userToBeAdded = User.findByLoginId(userLoginId);
@@ -182,13 +166,6 @@
         return null;
     }
 
-    /**
-     * 그룹에서 멤버를 삭제한다.
-     *
-     * @param organizationName
-     * @param userId
-     * @return
-     */
     @Transactional
     public static Result deleteMember(String organizationName, Long userId) {
         Result result = validateForDeleteMember(organizationName, userId);
@@ -206,13 +183,6 @@
         }
     }
 
-    /**
-     * {@link #deleteMember(String, Long)}를 위해 사용되는 변수의 유효성 검사를 한다.
-     *
-     * @param organizationName
-     * @param userId
-     * @return
-     */
     private static Result validateForDeleteMember(String organizationName, Long userId) {
         Organization organization = Organization.findByOrganizationName(organizationName);
         if (organization == null) {
@@ -239,13 +209,6 @@
         return null;
     }
 
-    /**
-     * 그룹 멤버의 권한을 수정한다.
-     *
-     * @param organizationName
-     * @param userId
-     * @return
-     */
     @Transactional
     public static Result editMember(String organizationName, Long userId) {
         Form<Role> roleForm = form(Role.class).bindFromRequest();
@@ -260,14 +223,6 @@
         return status(Http.Status.NO_CONTENT);
     }
 
-    /**
-     * {@link #editMember(String, Long)}를 위해 사용되는 변수의 유효성 검사를 한다.
-     *
-     * @param roleForm
-     * @param organizationName
-     * @param userId
-     * @return
-     */
     private static Result validateForEditMember(Form<Role> roleForm, String organizationName, Long userId) {
         if (roleForm.hasErrors()) {
             flash(Constants.WARNING, "organization.member.unknownRole");
@@ -297,12 +252,6 @@
         return null;
     }
 
-    /**
-     * 그룹 페이지 안에있는 멤버 관리 페이지로 이동한다.
-     *
-     * @param organizationName
-     * @return
-     */
     public static Result members(String organizationName) {
         Result result = validateForSetting(organizationName);
         if (result != null) {
@@ -314,12 +263,6 @@
         return ok(members.render(organization, Role.findOrganizationRoles()));
     }
 
-    /**
-     * {@link #members(String)}를 위해 사용되는 변수의 유효성 검사를 한다.
-     *
-     * @param organizationName
-     * @return
-     */
     private static Result validateForSetting(String organizationName) {
         Organization organization = Organization.findByOrganizationName(organizationName);
         if (organization == null) {
@@ -334,12 +277,6 @@
         return null;
     }
 
-    /**
-     * 그룹 페이지 안에있는 그룹 관리 페이지로 이동한다.
-     *
-     * @param organizationName
-     * @return
-     */
     public static Result settingForm(String organizationName) {
         Result result = validateForSetting(organizationName);
         if (result != null) {
@@ -351,15 +288,6 @@
         return ok(setting.render(organization, form(Organization.class).fill(organization)));
     }
 
-    /**
-     * {@code location}을 JSON 형태로 저장하여 ok와 함께 리턴한다.
-     *
-     * Ajax 요청에 대해 redirect를 리턴하면 정상 작동하지 않음으로 ok에 redirect loation을 포함하여 리턴한다.
-     * 클라이언트에서 {@code location}을 확인하여 redirect 시킨다.
-     *
-     * @param location
-     * @return
-     */
     private static Result okWithLocation(String location) {
         ObjectNode result = Json.newObject();
         result.put("location", location);
@@ -395,12 +323,6 @@
         return redirect(routes.OrganizationApp.settingForm(modifiedOrganization.name));
     }
 
-    /**
-     * {@link #updateOrganizationInfo(String)}를 위해 사용되는 변수의 유효성 검사를 한다.
-     * @param organizationForm
-     * @param modifiedOrganization
-     * @return
-     */
     private static Result validateForUpdate(Form<Organization> organizationForm, Organization modifiedOrganization) {
         Organization organization = Organization.find.byId(modifiedOrganization.id);
         if (organization == null) {
app/controllers/PasswordResetApp.java
--- app/controllers/PasswordResetApp.java
+++ app/controllers/PasswordResetApp.java
@@ -39,28 +39,11 @@
 
 public class PasswordResetApp extends Controller {
 
-    /**
-     * 패스워드 재설정 메일 발송 페이지로 이동
-     *
-     * when: 사용자가 패스워드가 패스워드 재설정(forget password) 링크를 눌렀을 때
-     * @return 패스워드 재설정 메일 발송 페이지
-     */
     public static Result lostPassword(){
         // render(message: String, sender: String, errorMessage: String, isSent: Boolean)
         return ok(lostPassword.render("site.resetPasswordEmail.title", null, null, false));
     }
 
-    /**
-     * password reset 메일 발송 요청
-     *
-     * when: 로그인 아이디와 이메일을 입력해서 패스워드 재설정 메일 요청을 했을 때
-     *
-     * - form으로부터 {@code loginId}와 {@code emailAddress}를 가져온다.
-     * - 요청한 {@code loginId}가 존재하고 {@code email}이 일치하면 패스워드 reset용 링크가 첨부된 메일을 발송한다.
-     * - 불일치하면 에러메시지를 표시한다.
-     *
-     * @return password reset 메일 요청 페이지
-     */
     public static Result requestResetPasswordEmail(){
         DynamicForm requestData = form().bindFromRequest();
         String loginId = requestData.get("loginId");
@@ -83,21 +66,7 @@
         return ok(lostPassword.render("site.resetPasswordEmail.title", emailAddress, errorMessage, isMailSent));
     }
 
-    /**
-     * password reset 페이지로 이동가능한 링크가 첨부된 email을 발송한다.
-     *
-     * when: password reset을 위해 생성된 {@code hashString}으로 password reset 메일을 발송하고자 할 때
-     *
-     * - play의 {@code application.conf} 파일에서 {@code smtp.user}와 {@code smtp.domain}을 읽어들여서 sender 주소로 사용한다.
-     * - password reset URL을 메일 본문에 첨부해서 발송
-     *
-     * @param user 요청한 email로 찾아낸 사용자 정보
-     * @param hashString 랜덤하게 생성해낸 해당 사용자용 hash 문자열
-     * @return
-     */
     private static boolean sendPasswordResetMail(User user, String hashString) {
-        //ToDo SiteApp.sendMail()과 통합할 것
-        //ToDo site email setting check 하는 부분이 빠져 있음
         Configuration config = play.Play.application().configuration();
         String sender = config.getString("smtp.user") + "@" + config.getString("smtp.domain");
         String resetPasswordUrl = getResetPasswordUrl(hashString);
@@ -118,14 +87,6 @@
         }
     }
 
-    /**
-     * password reset을 위한 URL link를 만든다.
-     *
-     * - application.conf에서 {@code application.hostname}설정과 {@code application.port} 설정을 읽어들인다.
-     * - 설정되어 있지 않았을 경우에는 개발환경이라고 가정하고 LOCAL_HOST_IP:DEV_MODE_PORT로 URL link를 만든다.
-     * @param hashString
-     * @return password reset을 위한 URL link
-     */
     private static String getResetPasswordUrl(String hashString) {
         Configuration config = play.Play.application().configuration();
         String hostname = config.getString("application.hostname");
@@ -134,25 +95,10 @@
         return "http://" + hostname + "/resetPassword?s=" + hashString;
     }
 
-    /**
-     * password를 재설정하는 페이지로 이동
-     *
-     * @param s
-     * @return
-     */
     public static Result resetPasswordForm(String hashString){
         return ok(resetPassword.render("title.resetPassword", form(User.class), hashString));
     }
 
-    /**
-     * password reset 메일을 요청한 사용자의 패스워드롤 새로운 패스워드로 교체한다.
-     *
-     * - 요청된 폼에서 유효검증용 {@code hashString}과 {@code password}를 읽어들인다.
-     * - 유효한 {@code hashString}인지를 확인한다.
-     * - 유효하면 패스워드를 재설정 아니면 로그에만 남기도 로그인 페이지로 이동한다.
-     *
-     * @return login 페이지로 이동
-     */
     public static Result resetPassword(){
         DynamicForm requestData = form().bindFromRequest();
         String hashString = requestData.get("hashString");
app/controllers/ProjectApp.java
--- app/controllers/ProjectApp.java
+++ app/controllers/ProjectApp.java
@@ -80,15 +80,10 @@
 import static utils.LogoUtil.*;
 import static utils.TemplateHelper.*;
 
-/**
- * ProjectApp
- *
- */
 public class ProjectApp extends Controller {
 
     private static final int ISSUE_MENTION_SHOW_LIMIT = 2000;
 
-    /** 자동완성에서 보여줄 최대 프로젝트 개수 */
     private static final int MAX_FETCH_PROJECTS = 1000;
 
     private static final int COMMIT_HISTORY_PAGE = 0;
@@ -123,21 +118,6 @@
         return ok(result);
     }
 
-    /**
-     * 프로젝트 Home 페이지를 처리한다.<p />
-     *
-     * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br />
-     * 읽기 권한이 없을 경우는 unauthorized로 응답한다.<br />
-     * 해당 프로젝트의 최근 커밋, 이슈, 포스팅 목록을 가져와서 히스토리를 만든다.<br />
-     *
-     * @param ownerId
-     * @param projectName
-     * @return 프로젝트 정보
-     * @throws IOException Signals that an I/O exception has occurred.
-     * @throws ServletException the servlet exception
-     * @throws SVNException the svn exception
-     * @throws GitAPIException the git api exception
-     */
     @IsAllowed(Operation.READ)
     public static Result project(String ownerId, String projectName)
             throws IOException, ServletException, SVNException, GitAPIException {
@@ -163,17 +143,6 @@
         }
     }
 
-    /**
-     * {@code project}의 최근 커밋, 이슈, 포스팅 목록을 가져와서 히스토리를 만든다
-     *
-     * @param ownerId
-     * @param project
-     * @return 프로젝트 히스토리 정보
-     * @throws IOException Signals that an I/O exception has occurred.
-     * @throws ServletException the servlet exception
-     * @throws SVNException the svn exception
-     * @throws GitAPIException the git api exception
-     */
     private static List<History> getProjectHistory(String ownerId, Project project)
             throws IOException, ServletException, SVNException, GitAPIException {
         project.fixInvalidForkData();
@@ -195,14 +164,6 @@
         return History.makeHistory(ownerId, project, commits, issues, postings, pullRequests);
     }
 
-    /**
-     * 신규 프로젝트 생성 페이지로 이동한다.<p />
-     *
-     * 비로그인 상태({@link models.User#anonymous})이면 로그인 경고메세지와 함께 로그인페이지로 redirect 된다.<br />
-     * 로그인 상태이면 프로젝트 생성 페이지로 이동한다.<br />
-     *
-     * @return 익명사용자이면 로그인페이지, 로그인 상태이면 프로젝트 생성페이지
-     */
     @With(AnonymousCheckAction.class)
     public static Result newProjectForm() {
         Form<Project> projectForm = form(Project.class).bindFromRequest("owner");
@@ -211,16 +172,6 @@
         return ok(create.render("title.newProject", projectForm, orgUserList));
     }
 
-    /**
-     * 프로젝트 설정(업데이트) 페이지로 이동한다.<p />
-     *
-     * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br />
-     * 업데이트 권한이 없을 경우는 unauthorized로 응답한다.<br />
-     *
-     * @param ownerId
-     * @param projectName
-     * @return 프로젝트 정보
-     */
     @IsAllowed(Operation.UPDATE)
     public static Result settingForm(String ownerId, String projectName) throws Exception {
         Project project = Project.findByOwnerAndProjectName(ownerId, projectName);
@@ -229,16 +180,6 @@
         return ok(setting.render("title.projectSetting", projectForm, project, repository.getBranches()));
     }
 
-    /**
-     * 신규 프로젝트 생성(관리자Role 설정/코드 저장소를 생성)하고 Overview 페이지로 redirect 된다.<p />
-     *
-     * {@code loginId}와 {@code projectName}으로 프로젝트 정보를 조회하여 <br />
-     * 프로젝트가 이미 존재할 경우 경고메세지와 함께 badRequest로 응답한다.<br />
-     * 프로젝트폼 입력데이터에 오류가 있을 경우 경고메시지와 함께 badRequest로 응답한다.<br />
-     *
-     * @return 프로젝트 존재시 경고메세지, 입력폼 오류시 경고메세지, 프로젝트 생성시 프로젝트 정보
-     * @throws Exception
-     */
     @Transactional
     public static Result newProject() throws Exception {
         Form<Project> filledNewProjectForm = form(Project.class).bindFromRequest();
@@ -300,22 +241,6 @@
         return newProjectForm.hasErrors();
     }
 
-    /**
-     * 프로젝트 설정을 업데이트한다.<p />
-     *
-     * 업데이트 권한이 없을 경우 경고메세지와 함께 프로젝트 설정페이지로 redirect된다.<br />
-     * {@code ownerId}의 프로젝트중 변경하고자 하는 이름과 동일한 프로젝트명이 있으면 경고메세지와 함께 badRequest를 응답한다.<br />
-     * 프로젝트 로고({@code filePart})가 이미지파일이 아니거나 제한사이즈(1MB) 보다 크다면 경고메세지와 함께 badRequest를 응답한다.<br />
-     * 프로젝트 로고({@code filePart})가 이미지파일이고 제한사이즈(1MB) 보다 크지 않다면 첨부파일과 프로젝트 정보를 저장하고 프로젝트 설정(업데이트) 페이지로 이동한다.<br />
-     *
-     * @param ownerId user login id
-     * @param projectName the project name
-     * @return
-     * @throws IOException Signals that an I/O exception has occurred.
-     * @throws NoSuchAlgorithmException the no such algorithm exception
-     * @throws ServletException
-     * @throws UnsupportedOperationException
-     */
     @Transactional
     @IsAllowed(Operation.UPDATE)
     public static Result settingProject(String ownerId, String projectName)
@@ -391,16 +316,6 @@
         return updateProjectForm.hasErrors();
     }
 
-    /**
-     * 프로젝트 삭제 페이지로 이동한다.<p />
-     *
-     * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br />
-     * 업데이트 권한이 없을 경우는 unauthorized로 응답한다.<br />
-     *
-     * @param ownerId user login id
-     * @param projectName the project name
-     * @return 프로젝트폼, 프로젝트 정보
-     */
     @IsAllowed(Operation.DELETE)
     public static Result deleteForm(String ownerId, String projectName) {
         Project project = Project.findByOwnerAndProjectName(ownerId, projectName);
@@ -408,17 +323,6 @@
         return ok(delete.render("title.projectDelete", projectForm, project));
     }
 
-    /**
-     * 프로젝트를 삭제한다.<p />
-     *
-     * {@code ownerId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br />
-     * 삭제 권한이 없을 경우는 경고 메시지와 함께 설정페이지로 redirect된다. <br />
-     *
-     * @param ownerId the user login id
-     * @param projectName the project name
-     * @return the result
-     * @throws Exception the exception
-     */
     @Transactional
     @IsAllowed(Operation.DELETE)
     public static Result deleteProject(String ownerId, String projectName) throws Exception {
@@ -426,7 +330,6 @@
         project.delete();
         RepositoryService.deleteRepository(project);
 
-        // XHR 호출에 의한 경우라면 204 No Content 와 Location 헤더로 응답한다
         if (HttpUtil.isRequestedWithXHR(request())){
             response().setHeader("Location", routes.Application.index().toString());
             return status(204);
@@ -435,18 +338,6 @@
         return redirect(routes.Application.index());
     }
 
-    /**
-     * 프로젝트 멤버설정 페이지로 이동한다.<p />
-     *
-     * {@code loginId}와 {@code projectName}으로 프로젝트 정보를 가져온다.<br />
-     * 프로젝트 아이디로 해당 프로젝트의 멤버목록을 가져온다.<br />
-     * 프로젝트 관련 Role 목록을 가져온다.<br />
-     * 프로젝트 수정 권한이 없을 경우 unauthorized 로 응답한다<br />
-     *
-     * @param loginId the user login id
-     * @param projectName the project name
-     * @return 프로젝트, 멤버목록, Role 목록
-     */
     @Transactional
     @IsAllowed(Operation.UPDATE)
     public static Result members(String loginId, String projectName) {
@@ -457,21 +348,6 @@
                 Role.findProjectRoles()));
     }
 
-    /**
-     * 이슈나 게시판 본문, 댓글에서 보여줄 멘션 목록
-     *
-     * 대상
-     * - 해당 프로젝트 멤버
-     * - 해당 이슈/게시글 작성자
-     * - 해당 이슈/게시글의 코멘트 작성자
-     * - 프로젝트가 속한 그룹의 관리자와 멤버
-     *
-     * @param loginId
-     * @param projectName
-     * @param number 글번호
-     * @param resourceType
-     * @return
-     */
     @IsAllowed(Operation.READ)
     public static Result mentionList(String loginId, String projectName, Long number, String resourceType) {
         String prefer = HttpUtil.getPreferType(request(), HTML, JSON);
@@ -543,14 +419,6 @@
         }
     }
 
-    /**
-     * 멘션에 노출될 이슈 목록
-     *
-     * {@code state}와 {@code createdDate} 내림차순으로 정렬하여 {@code ISSUE_MENTION_SHOW_LIMIT} 만큼 가져온다.
-     *
-     * @param project