- SpringBoot
- JAVA
- MariaDB
- GitHub-Action CI/CD
- HTML
- CSS
- JS
- Bootstrap
- CentOS
- jQuery
- NAVER Cloud
- IntelliJ IDEA
- DBeaver
- Termius
목록 | 요구사항 | 구현여부 |
---|---|---|
RQ1 | 게시글 등록이 가능하다 | O |
RQ2 | 게시글 수정이 가능하다 | O |
RQ3 | 게시글 삭제가 가능하다 | O |
RQ4 | 댓글 등록이 가능하다 | O |
RQ5 | 댓글 수정이 가능하다 | O |
RQ6 | 댓글 삭제가 가능하다 | O |
RQ7 | 페이지 상단에 네비게이션 바 구현 | O |
RQ8 | 회원가입이 가능하다 | O |
RQ9 | 가입한 아이디로 로그인이 가능하다 | O |
RQ10 | 로그인 상태에서 로그아웃이 가능하다 | O |
RQ11 | 게시글을 페이징처리 한다. | O |
RQ12 | 검색창으로 질문의 검색이 가능하다. | O |
RQ13 | 로그인시 네비게이션바에 로그인 버튼이 사라지고 로그아웃 버튼이 생긴다 | O |
RQ14 | 게시글 목록의 게시글제목 옆에 댓글수가 나타난다 | O |
RQ15 | 게시글 목록에 해당 게시글의 글쓴이가 표시된다 | O |
public String list(Model model, @RequestParam(value="page", defaultValue="0") int page,@RequestParam(value = "kw", defaultValue = "") String kw) {
Page<Question> paging = this.questionService.getList(page,kw);
model.addAttribute("paging", paging);
return "question_list";
}
@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm, @PathVariable("id") Integer id, Principal principal) {
Question question = this.questionService.getQuestion(id);
if(!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
questionForm.setSubject(question.getSubject());
questionForm.setContent(question.getContent());
return "question_form";
}
@PreAuthorize("isAuthenticated()")
@PostMapping("/modify/{id}")
public String questionModify(@Valid QuestionForm questionForm, BindingResult bindingResult,
Principal principal, @PathVariable("id") Integer id) {
if (bindingResult.hasErrors()) {
return "question_form";
}
Question question = this.questionService.getQuestion(id);
if (!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
this.questionService.modify(question, questionForm.getSubject(), questionForm.getContent());
return String.format("redirect:/question/detail/%s", id);
}
@PreAuthorize("isAuthenticated()")
@GetMapping("/delete/{id}")
public String questionDelete(Principal principal, @PathVariable("id") Integer id) {
Question question = this.questionService.getQuestion(id);
if (!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "삭제권한이 없습니다.");
}
this.questionService.delete(question);
return "redirect:/";
}
네이버 클라우드에서 생성한 서버에 프로젝트 ci/cd 환경으로 배포하기
서버 ssh 터미널 접속
터미어스(or moba)를 이용해 해당 서버의 터미널로 접속을 한다.
배포도구 다운로드
epel-release / docker / mariaDB
// yum 업데이트
yum install epel-release -y
yum update -y
//도커 설치
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
systemctl enable docker
// 컨테이너 실행 (mariaDB)
docker run \
--name mariadb_1 \
-d \
--restart unless-stopped \
-e MARIADB_ROOT_PASSWORD=root123414 \
-e TZ=Asia/Seoul \
-p 3306:3306 \
-v /docker_projects/mariadb_1/conf.d:/etc/mysql/conf.d \
-v /docker_projects/mariadb_1/mysql:/var/lib/mysql \
-v /docker_projects/mariadb_1/run/mysqld:/run/mysqld/ \
mariadb:latest
mariaDB 보안 권한설정 / 깃헙토큰 /깃헙플로우
보안상 해당 설정은 비공개로 포스팅.
깃헙에서 러너 생성
깃헙 레포지토리 > 셋팅 > 액션 > 러너 > 리눅스
나오는 명령문을 실행하고 오류가 날경우 아래 유틸 다운로드
깃헙액션 오류 해결을 위한 유틸 다운로드
shasum 설치
-shasum은 SHA 메시지 다이제스트, 암호화 체크섬 또는 암호화 해시코드를 계산하는 데 사용됩니다.
#Reference : https://linuxhint.com/shasum-linux/
yum install perl-Digest-SHA -y
환경변수 설정
-GitHub action 은 기본적으로 루트 권한으로 실행되지 않도록 설계
-환경 변수 설정을 통해 루트 권한으로 실행할 수 있도록 허용해주면 원하는 작업을 성공할
export RUNNER_ALLOW_RUNASROOT="1"
Dotnet 6.0 설치
-닷넷 종속성 누락 설치
-아래의 명령어로 누락된 종속성을 설치할 수 있다.
./bin/installdependencies.sh
러너 실행
Enter the name of the runner group to add this runner to : #엔터
Enter the name of runner : #엔터
Enter any additional label : work-1 #워크플로우에 작성했던 라벨명
Enter name of work folder : #엔터
-완료 후 ./run.sh를 백그라운드로 실행
nohup ./run.sh &
실행 완료 / 오류 해결로그
완료 시 아래처럼 main branch에 git push를 할경우 자동으로 반영되어 재배포 된다.
도커이미지 빌드와 푸시 시 403오류: 권한설정 문제로 토큰설정이 잘못되어 발생하였다.
워크플로우의 yml파일 안에 토큰파일명이 잘못되어 해당내용 수정 후 해결
도커배포 시 무한대기 : 설정한 워크플로우 이름과 yml의 워크플로우 이름이 상이해 발생하였다. yml 워크플로우 이름 변경 후 해결