Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[비동기 댓글 기능] 효오 미션 제출합니다 #196

Merged
merged 53 commits into from
Aug 10, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
489c848
[게시글 생성/조회/수정/삭제] 올라프 미션 제출합니다. (#29)
school0bhy Jul 14, 2019
2bd3531
[게시판 회원 기능] 올라프 미션 제출합니다 (#64)
school0bhy Jul 23, 2019
0c40d2a
[게시판 회원 기능] 올라프 미션 제출 합니다. (#99)
school0bhy Jul 23, 2019
4ab8f1d
[댓글 기능] 올라프 미션 제출합니다. (#151)
school0bhy Aug 3, 2019
c5fbe7a
styles: convention
school0bhy Aug 4, 2019
4dccd6c
docs: README, TODO 작성 - 댓글 기능 AJAX
school0bhy Aug 5, 2019
3f5f479
refactor: CommonInterceptor 제거 (html에서 session으로 user접근)
school0bhy Aug 5, 2019
bc15545
refactor: 메시지 변경
school0bhy Aug 5, 2019
e05c7f5
feat: 댓글 생성 기능 AJAX로 구현
school0bhy Aug 5, 2019
86d0792
test: 댓글 생성 테스트 추가
school0bhy Aug 5, 2019
365ce32
feat: 댓글 수정 기능 Ajax로 구현
school0bhy Aug 5, 2019
7ceb4d9
refactor: session에서 user 가져오도록 수정
school0bhy Aug 5, 2019
9067973
feat: 댓글 개수 ajax로 구현
school0bhy Aug 6, 2019
552f971
feat: 댓글 보여주기 ajax로 구현
school0bhy Aug 6, 2019
792c174
feat: 댓글 삭제 ajax로 구현
school0bhy Aug 6, 2019
f3f9520
test: 댓글 목록 요청 테스트
school0bhy Aug 6, 2019
890596f
setting: 로그 설정 추가
school0bhy Aug 6, 2019
a00711c
refactor: 로그 메세지 추가
school0bhy Aug 6, 2019
9732f34
setting: lombok dependency 설정
school0bhy Aug 6, 2019
25fb4dd
Revert "revert"
vsh123 Aug 6, 2019
8ca7533
[게시글 생성/조회/수정/삭제] 효오 미션 제출합니다. (#36)
hyojaekim Jul 16, 2019
f37c0de
[게시판 회원 기능] 효오 미션 제출합니다. (#90)
hyojaekim Jul 25, 2019
cbd64dc
[댓글 기능] 효오 미션 제출합니다. (#154)
hyojaekim Aug 4, 2019
22a5c73
Revert "revert mission"
vsh123 Aug 6, 2019
53cc02d
[게시글 생성/조회/수정/삭제] 올라프 미션 제출합니다. (#29)
school0bhy Jul 14, 2019
bc5ef61
[게시판 회원 기능] 올라프 미션 제출합니다 (#64)
school0bhy Jul 23, 2019
6356a27
[게시판 회원 기능] 올라프 미션 제출 합니다. (#99)
school0bhy Jul 23, 2019
cc82008
[댓글 기능] 올라프 미션 제출합니다. (#151)
school0bhy Aug 3, 2019
c871c06
styles: convention
school0bhy Aug 4, 2019
a89b331
docs: README, TODO 작성 - 댓글 기능 AJAX
school0bhy Aug 5, 2019
45dfbac
refactor: CommonInterceptor 제거 (html에서 session으로 user접근)
school0bhy Aug 5, 2019
6fb491e
refactor: 메시지 변경
school0bhy Aug 5, 2019
79d3c96
feat: 댓글 생성 기능 AJAX로 구현
school0bhy Aug 5, 2019
8c3939b
test: 댓글 생성 테스트 추가
school0bhy Aug 5, 2019
f538cd6
feat: 댓글 수정 기능 Ajax로 구현
school0bhy Aug 5, 2019
b66b8a1
refactor: session에서 user 가져오도록 수정
school0bhy Aug 5, 2019
0ed6144
feat: 댓글 개수 ajax로 구현
school0bhy Aug 6, 2019
48b6804
feat: 댓글 보여주기 ajax로 구현
school0bhy Aug 6, 2019
61ab02d
feat: 댓글 삭제 ajax로 구현
school0bhy Aug 6, 2019
ee42bc0
test: 댓글 목록 요청 테스트
school0bhy Aug 6, 2019
952f4e3
setting: 로그 설정 추가
school0bhy Aug 6, 2019
700122c
refactor: 로그 메세지 추가
school0bhy Aug 6, 2019
cf05c2a
setting: lombok dependency 설정
school0bhy Aug 6, 2019
092a78f
add: 자동 배포 script 파일 작성
school0bhy Aug 6, 2019
5f56704
Merge branch 'step-ajax' of https://github.com/school0bhy/jwp-blog in…
hyojaekim Aug 6, 2019
8dcab91
refactor: entity 공통 부분 추상클래스 상속으로 중복 제거
school0bhy Aug 7, 2019
ee9c871
refactor: exception 패키지 분리
school0bhy Aug 8, 2019
aad2bcc
refactor: CommentService로 로직 이동
school0bhy Aug 8, 2019
6762159
refactor: 비동기 로직 에러 처리 구현
school0bhy Aug 8, 2019
93cc39a
refactor: CommentController 리턴 타입 변환
school0bhy Aug 8, 2019
b6895b0
Merge branch 'step-ajax' of https://github.com/school0bhy/jwp-blog in…
hyojaekim Aug 8, 2019
994e20f
refactor: git pull
hyojaekim Aug 8, 2019
356f91b
docs: update readme
hyojaekim Aug 8, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
107 changes: 78 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,87 @@
## 나만의 블로그 서비스 (1주차)
# 나만의 블로그 서비스

### 기능 요구사항
- 게시글 생성
- 게시글 작성 페이지 이동
## 게시글 관련 기능

### 게시글 생성/조회 기능
1. 게시글 작성 페이지 이동
- 로그인하지 않은 사용자는 로그인 요청
- 메인페이지(index.html)에서 게시글 생성 버튼을 누르기
- GET /writing 으로 요청
- ```GET /writing``` 으로 요청
- 작성 페이지(article-edit.html)로 이동
- 게시글 작성
- POST /articles 으로 요청
- 게시글 생성 시 게시글은 ArticleRepository의 List<Article> articles에 저장한다.

2. 게시글 작성
- 로그인하지 않은 사용자는 로그인 요청
- ```POST /articles``` 으로 요청
- 게시글 생성 시 게시글은 ```ArticleRepository```의 ```List<Article> articles```에 저장한다.
- 게시글 페이지(article.html)로 이동
- 게시글 목록 조회
- 메인 페이지 이동
- GET / 으로 요청으로 이동 시 메인 페이지에 게시글 목록이 노출
- 게시글 조회
- 게시글 페이지 이동
- 메인페이지(index.html)에서 게시글을 클릭 시 게시글 페이지(article.html)으로 이동
- GET /articles/{articleId} 으로 요청

3. 게시글 목록 조회
- 메인페이지 이동 시 ```GET /``` 으로 요청하여 전체 게시글 목록이 노출

4. 게시글 조회
- 메인페이지에서 게시글 클릭시 ```GET /articles/{articleId}``` 으로 요청하여 게시글 페이지로 이동

- 게시글 수정
- 게시글 수정 페이지 이동
- 게시글 페이지(article.html)에서 수정 버튼 누르기
- GET /articles/{articleId}/edit 으로 요청
- 게시글 수정 페이지(article-edit.html)로 이동
- 게시글 수정
- PUT /articles/{articleId} 으로 요청
- 게시글 페이지(article.html)로 이동
- 게시글 삭제
### 게시글 수정/삭제 기능
1. 게시글 수정 페이지 이동
- 작성자만 접근 가능
- 게시글 페이지(article.html)에서 수정 버튼 누르기
- GET /articles/{articleId}/edit 으로 요청
- 게시글 수정 페이지(article-edit.html)로 이동

2. 게시글 수정
- 작성자만 접근 가능
- ```PUT/articles/{articleId}``` 으로 요청 시 게시글 페이지(article.html)로 이동

3. 게시글 삭제
- 작성자만 접근 가능
- 게시글 페이지(article.html)에서 삭제 버튼 누르기
- DELETE /articles/{articleId} 으로 요청
- 게시글 목록 조회 페이지(index.html)로 이동

## 회원 관련 기능


### 제약조건
- HTML 중복제거
- 정적 파일 수정 시 재시작 하지 않고 변경사항 반영하기
- class 파일 수정 시 자동으로 재시작 하기
### 회원 등록/조회 기능
1. 회원등록
- 회원가입페이지(signup.html)에서 ``POST /users`` 로 요청
- Spring Data JPA를 이용하여 DB에 user 정보를 저장
- 생성 후 로그인 화면으로 이동
- 회원가입 시 아래의 회원가입 규칙을 지켜야 하고, 위반 시 사용자에게 알려준다.

> 회원가입 규칙
> - 동일한 email로 중복가입을 할 수 없다.
> - 이름은 2~10자로 제한하며 숫자나 특수문자가 포함될 수 없다.
> - 비밀번호는 8자 이상의 소문자, 대문자, 숫자, 특수문자의 조합이다.
> - 비밀번호 확인 기능이 동작해야 한다.

2. 회원조회
- ``GET /users`` 로 요청하여 회원목록페이지(user-list.html) 이동
- DB에 저장된 회원 정보 노출

### 로그인 기능
1. 로그인 기능
- 로그인 성공 시 메인 화면을 띄우고 우측 상단에 사용자 이름을 띄운다.
- 로그인 실패 시 상황에 맞는 실패 메시지를 띄운다.
- 이메일이 없는 경우
- 비밀번호가 틀린 경우

2. 로그아웃 기능
- 로그아웃 시 메인 화면을 띄운다.

3. 기타
- 로그인 한 유저가 로그인/회원가입 화면에 접근할 경우 메인 화면을 띄운다.


### 회원 수정/탈퇴 기능
1. 회원 수정
- 로그인한 사용자는 자신의 회원정보 수정 가능
- 로그인하지 않은 사용자는 회원정보 수정 불가, ``GET /``로 redirect
2. 회원 탈퇴
- 로그인한 사용자는 회원 탈퇴 요청 가능 (DELETE 메소드를 이용)
- 로그인하지 않은 사용자는 탈퇴 요청시 ``GET /``로 redirect


## 댓글 관련 기능
1. 댓글 작성 시 작성자와 게시글 정보가 같이 저장
2. 댓글 생성/조회/수정/삭제 조회 기능
- 수정/삭제는 댓글 작성자만 가능
3. AJAX로 구현
121 changes: 121 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
## 게시글 관련 기능 TODO

### 게시글 작성
- [X] 게시글 작성페이지 이동 : ``GET /writing`` 요청 시 200 OK
- [X] 게시글 작성 : ``POST /articles``로 요청시 작성한 게시글 페이지로 이동

### 게시글 생성
- [X] 제목, 배경 이미지 url, 내용이 모두 입력되었을 때 -> 정상 처리
- [X] 제목, 내용이 입력되지 않았을 때 -> 에러 발생
- [X] 배경 이미지 url이 입력되지 않았을 때 -> 정상 처리 (기본 값을 설정)

### 게시글 조회
- [X] 존재하는 게시글 id에 접근 했을 때 -> 정상 처리
- [X] 존재하지 않는 게시글 id에 접근 했을 때 -> 에러 발생

### 게시글 수정
- [X] 게시글 수정 페이지 이동 : ``GET /articles/{articleId}/edit``으로 요청 시 200 OK
<br>(게시글 수정 페이지(article-edit.html)로 이동)
- [x] 게시글 수정 : ``PUT /articles/{articleId}``로 요청시 작성한 게시글 페이지로 이동
- [X] 존재하는 게시글 수정 (update) -> 정상 처리
- [X] 존재하지 않는 게시글 수정 요청 -> 에러 발생

### 게시글 삭제
- [X] 게시글 페이지(article.html)에서 삭제 버튼 클릭 시 ``DELETE /articles/{articleId}`` 으로 요청
- [X] 게시글 삭제 후 게시글 목록 조회 페이지(index.html)로 이동
- [X] 존재하는 게시글 삭제 (delete) 요청 -> 정상 처리
- [X] 존재하지 않는 게시글 삭제 요청 -> 에러 발생

### 제약조건
- [X] HTML 중복 제거
- [X] 정적 파일 수정 시 재시작하지 않고 변경사항 반영하기
- [X] class 파일 수정 시 자동으로 재시작하기

### 기타
- [X] 커스텀 익셉션 만들기

### 피드백
- [X] Article 클래스에 update구현
- [X] 테스트 코드 중복 제거
- [X] 필드 인젝션 -> 생성자 인젝션
- [X] PathVariable 자료형 통일 (Integer/int)

## 회원 관련 기능

### 회원 등록
- [X] 회원가입페이지(signup.html) 에서 ``POST /users`` 로 요청하면
DB에 user정보 저장
- [X] 저장 후 로그인 화면으로 redirect
- [X] 실패 시 사용자에게 알려준다
- [X] 회원가입 관련 html 수정 (signup.html)

### 회원 가입 규칙
- [X] 동일한 email 중복 가입 시도 -> 에러
- [X] 이름은 2~10자, 숫자나 특수문자가 포함된 경우 -> 에러
- [X] 비밀번호는 8자 이상, 소문자, 대문자, 숫자, 특수문자의 조합이 아닌 경우 -> 에러
- [X] 비밀번호 확인 기능이 동작

### 회원 조회
- [X] ``GET /users``로 요청하여 회원 목록 페이지(user-list.html) 이동
- [X] 회원 목록 페이지에서 DB에 저장된 회원 정보 확인
- [X] user-list.html 수정

### 기타
- [X] MySql로 DB 변경
- [X] 실행 쿼리 보기 설정하기
- [X] update CrudRepository의 save 대안 찾아보기
- [X] 테스트 코드 독립성 - (테스트 메서드마다 DB 롤백할 수 있는 방법 찾아보기)

### 로그인
- [X] 로그인 성공 시 메인 화면(index.html)으로 redirect
- [X] 로그인 성공 시 메인화면 우측 상단에 사용자 이름을 띄운다.
- [X] 해당 이메일이 없는 경우 -> 에러
- [X] 비밀번호 불일치 경우 -> 에러
- [X] 로그아웃 요청 시 메인 화면(index.html)으로 redirect
- [X] 로그인 한 유저가 로그인/회원가입 화면에 접근할 경우 메인 화면(index.html)으로 redirect
- [X] 로그인 한 유저가 로그인/회원가입 화면에 접근할 경우 메인 화면(index.html)으로 redirect 테스트!
- [X] 로그인하지 않은 유저가 로그인/회원가입 화면에 접근할 경우 200 OK

### 회원 수정
- [X] ``GET /mypage`` 로 요청시 회원 정보 페이지로 이동 (200 OK)
- [X] ``GET /mypage/edit`` 로 요청시 회원정보 수정페이지로 이동 (200 OK)
- [X] ``POST /mypage``로 요청시 회원 정보 수정하고 ``GET /mypage`` 로 redirect
- [X] 회원 정보 수정 테스트 코드!

### 회원 탈퇴
- [X] MyPage > profile 하단 > 탈퇴 버튼 추가
- [X] 탈퇴버튼 클릭시 ``DELETE /users`` 로 요청 ~ 탈퇴 처리 후 ``GET /`` 로 redirect

## 게시글 추가 기능

1. 게시글 작성 관련 요청 (``GET /articles/writing``, ``POST /articles/write``)
- [x] 로그인한 사용자 -> 정상 동작 (원래대로)
- [x] 로그인하지 않은 사용자 -> 로그인 요청 (로그인페이지로 redirect)

2. 게시글 수정 / 삭제 관련 요청 (``GET /articles/{articleId}/edit``, ``PUT /articles/{articleId}``, ``DELETE /articles/{articleId}``)
- [x] 로그인하지 않은 사용자 -> 에러 발생 (로그인페이지로 redirect)
- [x] 작성자인 경우 -> 정상 동작 (원래대로)
- [x] 작성자가 아닌 경우 -> 에러 발생 (홈으로 이동할때 alert 창 발생)

## 댓글 관련 기능

- [x] 댓글 보기 : 게시글 조회할 때 연관 댓글 함께 보여주기
### 댓글 작성
- [x] ``POST /comment/{articleId}``
- [x] ``PUT /comment/{commentId}/``
- [x] ``DELETE /comment/{commentId}/``

### 댓글 관련 AJAX
- [x] 등록
- [x] 수정
- [x] 삭제

### refartor_01
- [ ] 테스트 코드 중복 제거
- [x] 에러처리(비동기에서 리다이렉트로 에러처리 불가하므로...)
<br>핸들러 메서드, html 부분 수정 필요
- [x] 모든 엔터티의 공통 필드(ex: timestamp) 를 추상 클래스를 이용하여 중복 제거
- [x] exception 패키지 분리하여 관리
- [ ] read/write 서비스 하나 서비스로...
- [x] 리턴을 위한 dto
- [x] CommentController의 createComment 메서드 부분 (서비스 안으로 로직 이동)
24 changes: 12 additions & 12 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,36 @@ plugins {
}

apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.springframework.boot'

group = 'techcourse'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
targetCompatibility = 1.8

bootJar {
baseName = 'gs-accessing-data-mysql'
version = '0.1.0'
}

repositories {
mavenCentral()
}

dependencies {
annotationProcessor 'org.projectlombok:lombok:1.18.8'
compileOnly 'org.projectlombok:lombok:1.18.8'
implementation 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-devtools'
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.h2database:h2'
implementation 'mysql:mysql-connector-java'
runtimeOnly 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'
implementation group: 'org.hibernate', name: 'hibernate-java8', version: '5.0.0.CR1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.2'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.2'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit'
}
testImplementation 'org.springframework.boot:spring-boot-starter-webflux'
testImplementation("org.springframework.boot:spring-boot-devtools")
testImplementation 'org.junit.jupiter:junit-jupiter-params:5.4.2'
testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation 'com.h2database:h2'
runtimeOnly 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'

annotationProcessor 'org.projectlombok:lombok'
}
39 changes: 39 additions & 0 deletions deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

REPOSITORY=/home/ubuntu/app/git

cd $REPOSITORY/jwp-blog/

echo "> Git Pull"

git pull

echo "> 프로젝트 Build 시작"

./gradlew build

echo "> Build 파일 복사"

cp ./build/libs/*.jar $REPOSITORY/

echo "> 현재 구동중인 애플리케이션 pid 확인"

CURRENT_PID=$(lsof -t -i:8080 -s TCP:LISTEN)

echo "$CURRENT_PID"

if [ -z $CURRENT_PID ]; then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -2 $CURRENT_PID"
kill -9 $CURRENT_PID
sleep 5
fi

echo "> 새 어플리케이션 배포"

JAR_NAME=$(ls $REPOSITORY/ |grep 'blog' | tail -n 1)

echo "> JAR Name: $JAR_NAME"

nohup java -jar $REPOSITORY/$JAR_NAME &
6 changes: 3 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Wed Jul 10 14:33:33 KST 2019
#Fri Jul 19 11:35:16 KST 2019
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
zipStoreBase=GRADLE_USER_HOME
Binary file removed src/.DS_Store
Binary file not shown.
Binary file removed src/main/.DS_Store
Binary file not shown.
11 changes: 7 additions & 4 deletions src/main/java/techcourse/myblog/HelloWorldController.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package techcourse.myblog;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;

@RestController
@Controller
public class HelloWorldController {
@GetMapping("/helloworld")
public String temp(String blogName) {
@ResponseBody
public String blogNameByGet(String blogName) {
return blogName;
}

@PostMapping("/helloworld")
public String asd(@RequestBody String blogName) {
@ResponseBody
public String blogNameByPost(@RequestBody String blogName) {
return blogName;
}
}
2 changes: 2 additions & 0 deletions src/main/java/techcourse/myblog/MyblogApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@

@SpringBootApplication
public class MyblogApplication {

public static void main(String[] args) {
SpringApplication.run(MyblogApplication.class, args);
}

}
Loading