๋ด๋นํ์ฌ ์์
ํ ๋ถ๋ถ๋ง ๊ฐ์ถ๋ฆฐ ์ ์ฅ์์
๋๋ค. ์ ์ฒด ์ฝ๋๊ฐ ๊ถ๊ธํ์๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
ํ๋ก์ ํธ ๋ฉ์ธ ์ ์ฅ์ ์ฃผ์: https://github.com/codestates-seb/seb45_main_004
์ด๋ฒ์ฃผ ํ ์์ผ ํ๊ต ๋ง์ง ํฌ์ด๋ฅผ ํจ๊ปํ ์ฌ๋ ๋ชจ์ฌ๋ผ! ํ๋ฃจ ๋จ์์ ๊ฐ๋จํ ๋ชจ์์ ํจ๊ปํ ์ธ์ฐ์ ๋ชจ์งํ๋ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ์ฌ ํ๋ก์ ํธ ์งํ ๊ธฐ๊ฐ ๋์ ํด๊ฒฐํ์ง ๋ชปํ๊ฑฐ๋, ์์
์๊ฐ์ด ๋ถ์กฑํ๋ ํญ๋ชฉ๋ค์ ํ๋ก์ ํธ ๋ฐ๋ชจ๋ฐ์ด ์ดํ์ ์์
ํ์ผ๋ฉฐ ํ์ฌ๋ ๊พธ์คํ๊ฒ ๋ฆฌํฉํ ๋ง ์์
์ค์ ์์ต๋๋ค.
๋ํ ํ๋ก์ ํธ์์ ํ์๋ค์ด ๊ตฌํํ ๋ด์ฉ์ ํ์ตํ๊ธฐ ์ํด ๋ค์ ๊ตฌํ ์์
์ค์ ์์ต๋๋ค.
-
ํ๋ก์ ํธ ๊ธฐ๊ฐ : 2023๋ 8์ 24์ผ(๊ธ) ~ 2023๋ 9์ 22์ผ(์)
-
๊ฐ๋ฐ ์ธ์ : ๋ฐฑ์๋ 3๋ช , ํ๋ก ํธ์๋ 3๋ช (์ด 6๋ช )
-
๋ฐฐํฌ ์ฃผ์: https://celebee.kro.kr
ํ ์คํธ ์์ด๋: [email protected] ๋น๋ฐ๋ฒํธ: 1234567Days โ๏ธโ๏ธ ํ์ฌ AWS ELB๋ฅผ ์ ๊ฑฐํ๋ฉด์ ์๊ธด CORS ์ค๋ฅ ํด๊ฒฐ ์ค์ผ๋ก ์ฌ์ดํธ ์ ์์ด ์ํํ์ง ์์ ์ ์์ต๋๋ค. (2024.04.30 ~) โ๏ธโ๏ธ
-
API ๋ช ์ธ์: Postman API Documentation
-
ํ๋ก์ ํธ ๋ ธ์ ๋งํฌ : Team Notion Link
๋ฉ์ธํ์ด์ง | ๊ธ ์์ธ ํ์ด์ง |
---|---|
![]() |
![]() |
๊ธ ์์ฑ ํ์ด์ง | ๋ง์ดํ์ด์ง |
![]() |
![]() |
๊ฐ ํ์ด์ง ๋ณ ๊ธฐํ ๋ด์ฉ
๋ฉ์ธํ์ด์ง
- ์ต์ ์ > ๋ง๊ฐ ์ > ๋ง๊ฐ ์๋ฃ ์์๋ก ์ฐ์ ์์๋ฅผ ์ค์ ํ์ฌ ๋ฉ์ธํ๋ฉด ๋ชจ์ ์ ๋ ฌ
- 'ALL' ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๋ฉฐ, ์นดํ ๊ณ ๋ฆฌ ๋ณ๊ฒฝ ์ ํด๋นํ๋ ๋ชจ์ ์ถ๋ ฅ
- ๋ฌดํ ์ค์ฝ๋กค์ผ๋ก ๊ตฌํํ์ฌ ๋ง์ ๋ชจ์์ ๋ ธ์ถ์ํด
- ๋ชจ์ ์ด๋ฏธ์ง์ ์ ํ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํด ์๋๊ฐ์๋ ๋ฉ์ธ ํ๋ฉด์ ๊ตฌ์ฑํจ
- ๋ชจ์ ๊ธ ์ ๋ชฉ๊ณผ ์ข์์ ์ ๋ ธ์ถ
๊ธ ์์ธ ํ์ด์ง
- ๋ชจ์์ ๋ํ [๋ ์ง, ์ฅ์, ๊ธ์ก, ์ฃผ์ต์ ์ ๋ณด, ์ฐธ์ฌ ์ธ์, ์์ธ ๋ด์ฉ] ์ ํ์ธํ ์ ์์
- 'Join' ๋ฒํผ์ ํด๋ฆญํ์ฌ ๋ชจ์์ ์ฐธ์ฌํ ์ ์์
- ์ํํ ๋ชจ์ ์งํ์ ์ํด ๋ชจ์ ์ญ์ , ์์ , ์ฐธ์ฌ ์ทจ์ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๊ธฐํํจ
- ์ ์ ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ๋ฉด ํด๋น ์ ์ ์ ๋ง์ดํ์ด์ง๋ก ํ๋ฉด ์ ํ๋จ
๊ธ ์์ฑ ํ์ด์ง
- ๋ชจ์ ์งํ ์ ์ธ์์ ํ์ ํ๊ณ ์ ์ํ๋ ๋ชจ์ ๋ ์ง 2์ผ ์ ์ ์๋ ๋ง๊ฐ๋๋๋ก ๊ธฐํ
- [์ ๋ชฉ, ๋ชจ์ ๋ ์ง, ์ธ์, ์์ธ ์ค๋ช , ์นดํ ๊ณ ๋ฆฌ, ๋ชจ์ ์ฅ์, ์ด๋ฏธ์ง] ๋ฅผ ์์ฑ์๊ฐ ๊ฒฐ์ ํ ์ ์์
- ์ ๋ด์ฉ์ ๋ชจ๋ ์์ฑํด์ผ ๋ชจ์ ๊ธ ์์ฑ์ด ๊ฐ๋ฅํจ
- ์ ํํ ์นดํ ๊ณ ๋ฆฌ์ ๋ฐ๋ผ ์ ํํ ์ ์๋ ์ด๋ฏธ์ง๊ฐ ๋ณ๊ฒฝ๋จ
๋ง์ดํ์ด์ง
- [ํ๋กํ ์ด๋ฏธ์ง ๋ณ๊ฒฝ, ์๊ฐ ๊ธ ๋ณ๊ฒฝ, ์ข์ํ ๋ชจ์ ํ์ธ, ์ฐธ์ฌํ ๋ชจ์ ํ์ธ] ๊ธฐ๋ฅ์ ํ ์ ์์
- ๋ชจ์ ์ด๋ฏธ์ง ํด๋ฆญ ์ ํด๋น ๋ชจ์์ ์์ธ ํ์ด์ง๋ก ํ๋ฉด ์ ํ๋จ
- ํ์ธ์ ๋ง์ดํ์ด์ง๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ, ํด๋น ์ ์ ๊ฐ ์ข์ํ ๋ชจ์๊ณผ ์ฐธ์ฌํ ๋ชจ์์ ํ์ธํ ์ ์์
- ์ ์ ํ๋ก์ฐ ๊ธฐ๋ฅ์ ์ถํ ์ ๋ฐ์ดํธ ์์ ์
ํ๋ก์ ํธ์์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
- ๋ชจ์ ์ฐธ์ฌ ๊ธฐ๋ฅ ๊ตฌํ
- ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ชจ์ ๋ง๊ฐ ์ฒ๋ฆฌ
- SSE ๋ฐฉ์์ผ๋ก ์๋ฆผ ๊ธฐ๋ฅ ๋น๋๊ธฐ ๊ตฌํ
- ํ๋ก์ ํธ ํ๊ฒฝ ๊ตฌ์ถ
a. AWS๋ฅผ ์ด์ฉํด ์๋ฒ ํ๊ฒฝ ๊ตฌ์ถ
b. Github Action์ ์ด์ฉํ์ฌ ์๋ ๋ฐฐํฌ ์ ๊ฐ์ก๋ ๋ฌธ์ ํด๊ฒฐ
c. ์ด์ ์๋ฒ ์์ ํ
- ์ฌ์ฉ ๊ธฐ์
๊ตฌ๋ถ | ๋ด์ฉ |
---|---|
Backend | Java 11 ,Spring Boot 2.7.14 , SpringDataJPA , Spring Cloud, Gradle |
DB | H2 , MySQL, AWS RDS |
Depoly | AWS EC2, AWS S3, Github Action, Docker |
API | Postman |
1. ๋ชจ์ ์ฐธ์ฌ ๊ธฐ๋ฅ ๊ตฌํ
//ApplicantService
//๋ชจ์ ์ฐธ์ฌ
public Applicant joinBoard(long boardId, boolean isJoin){
//ํด๋น ๋ชจ์์ ์ฐธ์ฌํ๋์ง ํ์ธ
Long memberId = extractMemberId();
isJoinAlready(boardId, memberId);
//๋ชจ์ ์ฐธ์ฌ ๋ก์ง
Applicant applicant = new Applicant();
Board board = boardRepository.getById(boardId); //๋ณด๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
applicant.setBoard(board);
applicant.setBoardImageUrl(board.getImageUrl());
Member member = memberRepository.getById(memberId); //๋ฉค๋ฒ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
applicant.setMember(member);
applicant.setMemberImageUrl(member.getImageUrl());
applicant.setMemberNickname(member.getNickname());
//ํ์ฌ ๋ชจ์ ์ฐธ์ฌ ์ธ์ ์ ์
๋ฐ์ดํธ
if(board.getCurrentNum() < board.getTotalNum()){
board.setCurrentNum(board.getCurrentNum()+1);
if (board.getCurrentNum() == board.getTotalNum()){
board.setStatus(Board.BoardStatus.BOARD_COMPLETE);
String rootImagePath = board.getImageUrl();
String cutPath = rootImagePath.substring(0, rootImagePath.length()-4);
System.out.println(cutPath);
board.setImageUrl(cutPath+"-closed.png"); //๋ง๊ฐ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝ
boardRepository.save(board);
//๋ชจ์ง ๋ง๊ฐ ์๋ฆผ ๋ฐ์ก
notifyCompleted(board);
}
}else {//์ธ์์ ๋ค ์ฐผ์ผ๋ฉด ์ถ๊ฐ ์ํจ
throw new BusinessLogicException(ExceptionCode.NOT_ALLOW_PARTICIPATE);
}
//์ฐธ์ฌ ์ ๋ณด ์ ์ฅ
Applicant savedApplicant = applicantRepository.save(applicant);
//๋ชจ์ ์ฐธ์ฌ ์ฒ๋ฆฌ
applicant.setJoin(true);
//์๋ฆผ ๋ฐ์ก
notifyApplicant(board);
notifyParticipants(board);
return savedApplicant;
}
//๋ชจ์ ์ฐธ์ฌ ์ค์ธ ๋ชจ๋ ์ธ์์๊ฒ ์๋ฆผ ์ ์ก
private void notifyParticipants(Board board){
alarmService.sendParticipantsNotification(board);
}
//๋ชจ์ ์ฐธ์ฌ ์๋ฃ ์๋ฆผ ์ ์ก (๋ชจ์ ์ฐธ์ฌ ์ ์ฒญ์์๊ฒ ์ ์ก)
private void notifyApplicant (Member member, Board board){
alarmService.sendApplicantNotification(member,board);
}
//๋ชจ์ ๋ชจ์ง ๋ง๊ฐ ์๋ฆผ ์ ์ก
private void notifyCompleted(Board board){
alarmService.sendCompletedNotification(board);
}
2. ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ชจ์ ๋ง๊ฐ ์ฒ๋ฆฌ
//BoardService
//๋ ์ง์ง๋ ๋ชจ์ ๋ง๊ฐ์ฒ๋ฆฌ
@Scheduled(cron = "0 0 0 * * *") //๋งค์ผ 00์์ ์ํ
public void checkDate(){
LocalDate today = LocalDate.now();
List<Board> closedList = findEventsScheduledForDate(today.plus(2, ChronoUnit.DAYS));
for (Board board : closedList){
board.setStatus(Board.BoardStatus.BOARD_COMPLETE);
String rootImagePath = board.getImageUrl();
String cutPath = rootImagePath.substring(0, rootImagePath.length()-4);
System.out.println(cutPath);
board.setImageUrl(cutPath+"-closed.png");
boardRepository.save(board);
//์๋ฆผ ๋ฐ์ก
notifyDeadline(board);
}
}
//ํด๋น ๋ ์ง์ ์์ ๋ ๋ชจ์ ๊ฒ์(์ด๋ฉ์ผ ๋ฐ์ก ๊ด๋ จ ๋ฉ์๋)
public List<Board> findEventsScheduledForDate(LocalDate eventDate ) {
//BoardStatus๊ฐ ๋ชจ์ง์ค ์ํ์ธ ๋ชจ์๋ง ๋ฐํ
return boardRepository.findByDateAndStatus(eventDate, Board.BoardStatus.BOARD_RECRUITING);
}
3. SSE ๋ฐฉ์์ผ๋ก ์๋ฆผ ๊ธฐ๋ฅ ๋น๋๊ธฐ ๊ตฌํ
์ฌ์ฉ์๊ฐ ์๋ฆผ์ ์ญ์ ํ์ง ์์๋ค๋ฉด ์๋ฆผ GET ์์ฒญ ์ ์ง๋ ์๋ฆผ๋ค์ ๋ชจ๋ ๋ณด๋ด์ฃผ๊ณ , ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ๋ณด๋ด์ผ ํ์ต๋๋ค. ๋ฐ๋ผ์ ์ค์๊ฐ์ผ๋ก ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค ์ ์๋ ์ฅ์ ์ ๊ฐ์ง SSE(Server-Sent-Events) ๋ฐฉ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. ์๋ฆผ ๋ฐ์ก ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. - ๋ชจ์ ๊ธ ์์ฑ์ด ์๋ฃ๋์์ ๋ - ์๋ก์ด ์ฌ์ฉ์๊ฐ ๋ชจ์์ ์ฐธ์ฌํ์ ๋ - ๊ธฐ์กด์ ๋ชจ์์ ์ฐธ์ฌํ ๋ชจ๋ ์ธ์์๊ฒ ์๋ฆผ ๋ฐ์ก - ๋ชจ์์ด ๋ง๊ฐ๋์์ ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ํด๋ผ์ด์ธํธ์์ ์๋ฆผ ๊ตฌ๋ ์์ฒญ์ ๋ณด๋ ๋๋ค. ๊ตฌ๋ ์์ฒญ ์ ๋ฐ์ํ์ฌ ๋๋ฝ๋ ์๋ฆผ์ด ์๋์ง ํ์ธํ๊ณ , ๋๋ฝ๋ ์๋ฆผ์ ํฌํจํด ๊ตฌ๋ ์ด ๋์ด์๋ ๋์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ฉด ์๋ฆผ์ ๋ณด๋ด์ค๋๋ค.
//alaramService
//ํด๋ผ๊ฐ ๊ตฌ๋
์ ์ํด ํธ์ถํ๋ ๋ฉ์๋
public SseEmitter subscribe(Long memberId, String lastEventId) {
String id = makeTimeIncludedId(memberId);
SseEmitter emitter = emitterRepository.save(id, new SseEmitter(DEFAULT_TIMEOUT));
//emitter ๊ฐ ์๋ฃ๋ ๋ emitter๋ฅผ ์ญ์ (๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ์ก๋ ์ํ)
emitter.onCompletion(() -> emitterRepository.deleteById(id));
//emitter ๊ฐ ํ์์์๋์์ผ๋ฉด emitter ์ญ์ (์ง์ ๋ ์๊ฐ๋์ ์ด๋ค ์ด๋ฒคํธ๋ ์ ์ก x)
emitter.onTimeout(() -> emitterRepository.deleteById(id));
//503 ์๋ฌ ๋ฐฉ์งํ๊ณ ์ ๋๋ฏธ ์ด๋ฒคํธ ์ ๋ฌ
sendToClient(emitter, id, "EventStream Created. [memberId=" + memberId + "]");
//ํด๋ผ๊ฐ ๋ฏธ์์ ํ event๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ ์ก (์ ์ค ๋ฐฉ์ง)
if (hasLostData(lastEventId)){
sendLostdata(lastEventId, memberId, emitter);
}
return emitter;
}
/**
* ์๋ฆผ ์์ฑ, ์ ์ก ๋ฉ์๋
* ์ฌ์ฉ์์ ๋ชจ๋ ์๋์ ์ฝ์์ฒ๋ฆฌ
*/
@Async
@Transactional
public void sendAlarm(Member member, Board board, Alarm.AlarmStatus alarmStatus, String content){
Alarm alarm = Alarm.create(member, board, alarmStatus,content);
alarmRepository.save(alarm);
Map<String, SseEmitter> sseEmitters = emitterRepository.findAllEmittersStartWithByMemberId(member.getId());
String eventId = makeTimeIncludedId(member.getId());
System.out.println(eventId);
sseEmitters.forEach((key, emitter) -> {
//๋ฐ์ดํฐ ์บ์ ์ ์ฅ (์ ์ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด)
emitterRepository.saveEventCache(key,alarm);
//๋ฐ์ดํฐ ์ ์ก
sendToClient(emitter,eventId, content);
});
}
4. ํ๋ก์ ํธ ํ๊ฒฝ ๊ตฌ์ถ
-
AWS๋ฅผ ์ด์ฉํด ์๋ฒ ํ๊ฒฝ ๊ตฌ์ถ
AWS๋ ๋ง์ ์ ์ ์จ์ ์ฐจ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ด๋ จ ์๋ฃ๋ค์ด ๋ง๊ณ , ํด๋ผ์ฐ๋ ์๋ฒ๋ฅผ ์ฒ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์์ ์ฐธ๊ณ ํ ์ ์๋ ์๋ฃ๊ฐ ๋ง์ ๊ฒ์ ํฐ ์ฅ์ ์ผ๋ก ์๊ฐํ์ฌ AWS๋ฅผ ์ฌ์ฉํ์ต๋๋ค. AWS EC2 ์ RDS๋ฅผ ์ด์ฉํด ์๋ฒ ํ๊ฒฝ์ ๊ตฌ์ถํ์์ผ๋ฉฐ, S3 ๋ฒํท์ 2๊ฐ ๊ตฌ์ฑํ์ฌ ํ๋ก ํธ ๋ฐฐํฌ์ ํ์ผ ์๋ฒ๋ก ์ฌ์ฉํ์์ต๋๋ค.
๋ํ, ๋์ ์ฝํ ์ธ ๋ก๋ฉ ์๊ฐ ๋จ์ถ๊ณผ ํธ๋ํฝ ๊ธ์ฆ์ ๋์ํ๊ธฐ ์ํด AWS CloudFront๋ฅผ ์ ์ฉํ์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ 515ms โ 84ms ๋จ์ถํ์ต๋๋ค.
๋ด ๋๋ฉ์ธ ํ๊ตญ์์ ๋๋ฉ์ธ ์ฃผ์๋ฅผ ๋ฑ๋กํ๊ณ AWS route53์ ์ด์ฉํด CloudFront์ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ์ฌ ํ๋ก์ ํธ์ DNS๋ฅผ ์ ์ฉํ์ต๋๋ค.
-
Github Action์ ์ด์ฉํ์ฌ ์๋ ๋ฐฐํฌ ์ ๊ฐ์ก๋ ๋ฌธ์ ํด๊ฒฐ
์ด์ Stackoverflow ํด๋ก ์ฝ๋ฉ ํ๋ก์ ํธ๋ฅผ ํ๋ฉฐ ์๋์ผ๋ก jar ํ์ผ์ ๋น๋ํ์ฌ AWS EC2๋ก ์ฎ๊ธด ํ ์๋ฒ๋ฅผ ๋ฐฐํฌํ๋๋ฐ, ๋น๋ ๋ฐ ๋ฐฐํฌ ๊ณผ์ ์์ ๊ฐ๋ฐ์์ ์ค์๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ก ๋ฐฐํฌ๊น์ง ๋ง์ ์๊ฐ์ด ์์๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๋ฐฐํฌ๊น์ง ์๊ฐ์ ๋จ์ถํ๊ธฐ ์ํด Github Action์ ์ด์ฉํด CI/CD๋ฅผ ์ ์ฉํ์ต๋๋ค.
๋ฐฑ์๋์ ๊ฒฝ์ฐ ๋์ปค ์ด๋ฏธ์ง๋ก jar ํ์ผ์ ๋น๋ํ์ฌ Ec2 ์์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๊ณผ์ ์ผ๋ก ์๋ฒ๋ฅผ ๋ฐฐํฌํ๊ณ , ํ๋ก ํธ์๋์ ๊ฒฝ์ฐ main ๋ธ๋ ์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๋ํ ๋ค, S3 ๋ฒํท์ผ๋ก ๋ฐฐํฌํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ๋ก ์ต๊ทผ 10๊ฐ ์๋ฒ ๋ฐฐํฌ๋ฅผ ๊ธฐ์ค์ผ๋ก CI/CD ๊ณผ์ ์ ํ๊ท 1๋ถ 32์ด ์์๋๋๋ก ๋จ์ถํ์ต๋๋ค.
-
์ด์ ์๋ฒ ์์ ํ
ํ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ๋ฐฑ์๋๊ฐ ๋จผ์ ์๋ฃํ์ฌ ์ถํ ๊ฐ๋ฐ ์์ ์ผ๋ก ์ ํ ํญ๋ชฉ์ ๋จผ์ ์์ ํ๊ฒ ๋์์ต๋๋ค. ์ด๋ ์๋ฒ ์ ๊ท ๊ธฐ๋ฅ ์ถ๊ฐ๋ก ์ด์์ ์๋ํ์ง ์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด์๊ณผ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋ถ๋ฆฌ ์์ ํ์ต๋๋ค. ๊ฐ๋ฐ ์๋ฒ ๋ํ AWS ๋ฅผ ์ด์ฉํด ์ด์ ์๋ฒ์ ๋์ผํ ์คํ์ผ๋ก ๊ตฌ์ฑํ์ผ๋ฉฐ, ์ ๊ท ๊ธฐ๋ฅ์ ๊ฐ๋ฐ ์๋ฒ์ ๋จผ์ ๋ฐฐํฌํ์ฌ ๊ธฐ๋ฅ์ ํ์ธํ ๋ค ๋ฌธ์ ๊ฐ ์์ผ๋ฉด main ๋ธ๋ ์น๋ก mergeํ์ฌ ์ด์ ์๋ฒ์ ๋ฐฐํฌํ์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ฌ์ด๋ ์ดํํธ์ ๋ํ ๋ถ๋ด์ ๋๊ณ ์๋ฆผ ๊ธฐ๋ฅ์ ์์ ํ ์ ์์์ต๋๋ค. ํ์ ์์ ์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํด ์ด์ํ๋ ๊ณผ์ ๊ณผ ์๋ฒ ํ๋๊ฐ ๊ฐ์ง๋ ๋ถ๋ด์ ์ค์ผ ์ ์๋ ๊ธ์ ์ ์ธ ์ด์ ๋ฅผ ์ง์ ๋๋ ์ ์๋ ๊ฒฝํ์ด์์ต๋๋ค.
โ git commit ๊ท์น
Type | ๋ด์ฉ |
---|---|
feat | ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ |
fix | ๋ฒ๊ทธ ์์ |
docs | ๋ฌธ์ ์์ |
style | ์ฝ๋ ํฌ๋งทํ , ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ (์ฝ๋๋ณ๊ฒฝ x) |
refactor | ์ฝ๋ ๋ฆฌํฉํ ๋ง |
์ฌ์ฉ ์์ [์ง๋ฌด] Type : ๋ณ๊ฒฝ ๋ด์ฉ ex) header ์ปดํฌ๋ํธ ์์ ์๋ฃ โก๏ธ [FE]feat : header component ์์ ์๋ฃ
โ ๋ฐฐํฌ ๊ท์น
- ๋งค ์คํ๋ฆฐํธ ๋ง๊ฐ์ผ 16์์ ๋น๋ ๋ฐ ๋ฐฐํฌ๋ฅผ ์งํํ๋ฉฐ, ๋ฐฐํฌ ์๋ฃ ํ 2์๊ฐ๋์ ํ ์คํธ๋ฅผ ์งํํ๋ค. (default)
- ์๋ฒ ๋ฐฐํฌ - ๋ฐฑ์๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ์๋ฃ๋๋ฉด 3์ธ์ด ๊ธฐ๋ฅ ํ ์คํธ ์งํ ํ ๋ฐฐํฌ ์งํํ๋ค.
- ํด๋ผ์ด์ธํธ ๋ฐฐํฌ - ๋งค ์คํ๋ฆฐํธ ๋ง๊ฐ ํ ์ทจํฉํ์ฌ ์งํํ๋ค.
- ๋ฐฐํฌ ๋ ์ง ๋๋ ์๊ฐ์ ๋ํด ๋ณ๊ฒฝ์ด ํ์ํ ์ ์ํต ์ฝ์ด ํ์์ ๊ณต์ ํ๋ค.
- ๋ฐฐํฌ ๋ฒ์ ์ ํ์ฌ ์คํ๋ฆฐํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํ๋ค. ex_์คํ๋ฆฐํธ1 ์์ ๋ฌผ ๋ฐฐํฌ ์ V1.0.0 ~
โ ์ด์/๊ฐ๋ฐ ์๋ฒ ๋ถ๋ฆฌ
- ๋ฆฌํฉํ ๋งํ ๋ด์ฉ(feat_FE/BE) -> dev ๋ธ๋ ์น๋ก ์ ๋ก๋ -> ๊ฐ๋ฐ ์๋ฒ์ ๋ฐฐํฌํ์ฌ ํ์ธ
- ์๋น์ค์ค์ธ ๊ณณ์์ ๋ฒ๊ทธ ์์ ํ์ ์ -> main ๋ธ๋ ์น์์ ๋ฐ๋ก fix or hotfix๋ก push.
- ๊ฐ๋ฐ ์๋ฒ์์ ํ ์คํธ ์๋ฃํ์ฌ ์๋น์ค ํ ์ฌํญ -> main ๋ธ๋์น๋ก merge -> ์ด์์๋ฒ์ ๋ฐฐํฌํ์ฌ ํ์ธ
V1.0.0 ๋ฉ์ธํ์ด์ง, ์ ์ ์ ๋ณด ์กฐํ, ๋ชจ์ ๊ธ ์์ธ ์กฐํ ๊ธฐ๋ฅ ๊ฐ๋ฐ
V2.0.0 ๋ฉ์ธ ํ์ด์ง ์ถ๊ฐ ๊ตฌ์ฑ, ์นดํ
๊ณ ๋ฆฌ ๋ณ ๊ฒ์ ๊ธฐ๋ฅ, ๋ชจ์ ์์ฑ, ์ฐธ์ฌ ๊ธฐ๋ฅ ๊ฐ๋ฐ
V3.0.0 ์๋ฆผ, ํ๋ก์, ํ์ด์ง ํจ๊ณผ, ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ฐ๋ฐ
V4.0.1 ์๋ฆผ ๊ธฐ๋ฅ ๋ก์ง ๋ถ๋ฆฌ ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ
V4.0.2 docker-compose ์ฌ์ฉ์ ์ํ workflow ์์ , ํ๊ฒฝ๋ณ์ ํ์ผ ์ถ๊ฐ