์ํฐ๋ ์น ํด๋ก ์ฝ๋ฉ(ํ๋ก ํธ์๋ 1๋ช , ๋ฐฑ์๋ 2๋ช )
'๋ณธ ํ ํ๋ฆฟ์ ์ ์๊ถ์ (์ฃผ)์ํํธ์คํ์ด๋์ ์์ต๋๋ค. ์์ ์ ์ฉ๋์ ์ฌ์ฉ์ ๊ธํฉ๋๋ค'
์ ์ ๊ธฐ๊ฐ: 2022๋ 5์ 21์ผ ~ 06์ 03์ผ
| ๋ถ๋ฅ | ๋ด์ฉ |
|---|---|
| Language & Frameworks | Java, Spring Boot, Spring Security(JWT) |
| Database | MySQL |
| Infra | AWS(EC2, RDS), Nginx, GitHub Action |
| API Docs. | Swagger, Excel |
- AngularJS Git Commit Message Conventions ์ ๋ฐ๋ฅธ๋ค.
feat: ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐfix: ๋ฒ๊ทธ ์์ refactor: ๊ธฐ๋ฅ ๋ณ๊ฒฝ์ด ์๋ ์ฝ๋ ์์ test: ํ ์คํธ ์ฝ๋ ์์ฑ ๋ฐ ์์ docs: ๋ฌธ์ ์์ฑ ๋ฐ ์์ build: ๋น๋ ํ์ผ ์์ฑ ๋ฐ ์์ style: ์คํ์ผ ๋ณ๊ฒฝ(reformat, indent)chore: ๋จ์ํ ์์
๊ฐ๋ฐ ์ผ์ง(2022๋ 5์ 21์ผ ~ 06์ 03์ผ)
์์ฃผ
- ERD์ค๊ณ(80%์งํ)
ํจ์ด
- ERD์ค๊ณ(80%์งํ)
- ๊ฐ๋น์ ๋๋ฉ์ธ ๊ตฌ์ ๋ฐ dev/prod ์๋ฒ ๊ตฌ์ถ
์์ฃผ
- ERD์ค๊ณ ๋ง๋ฌด๋ฆฌ
- API ๋ช ์ธ์ ์์ฑ
ํจ์ด
- ERD์์
- API ๋ฆฌ์คํธ์ (80%)
์์ฃผ
- ํ์๊ฐ์ API ๊ตฌํ
- ๋ก๊ทธ์ธ API ๊ตฌํ
- ํ๋ก ํธ์ ํ์ ์งํ
- 1์ฐจ ํผ๋๋ฐฑ ๋ฐ์
ํจ์ด
- git pull ์๋ฌ ํด๊ฒฐ
- git merge conflict ์๋ฌ ํด๊ฒฐ
- ํ๋ก ํธ์ ํ์ ์งํ : ๋ฆฌ์คํธ์ ํ API ์ค ์ฃผ์ API๋จผ์ ๊ตฌํํ๊ธฐ๋ก ํจ.
- 1์ฐจ ํผ๋๋ฐฑ : ERD ํ ์ด๋ธ ์นผ๋ผ๊ฐ ์ค ์นด๋ฉ์ผ์ด์ค ์๋ ๊ฒ ์นด๋ฉ์ผ์ด์ค๋ก ์์ , API Method ์ค DELETE๋ฅผ PATCH๋ก ์์
์์ฃผ
- ๋ฐฐ๋ ๊ด๊ณ ์กฐํ API ๊ตฌํ
- ์ ์ ์ ๋ณด ์กฐํ API ๊ตฌํ
ํจ์ด
- ์ฑ์ฉ๊ณต๊ณ ํ๋ฉด ์กฐํ API ๊ตฌํ
์์ฃผ
- ์ด๋ ฅ์ ์์ฑ API๊ตฌํ
- ํด๋น ์ ์ ์ ๋ชจ๋ ์ด๋ ฅ์ ์กฐํ API ๊ตฌํ
- ์ด๋ ฅ์ ์์ธ ์กฐํ API ๊ตฌํ
- ์ด๋ ฅ์ ์ญ์ API ๊ตฌํ
ํจ์ด
- ์ฑ์ฉ๊ณต๊ณ ์์ธํ๋ฉด ์กฐํ API ๊ตฌํ
- ์ฑ์ฉ๊ณต๊ณ ๋ถ๋งํฌ ์์ฑ API ๊ตฌํ
- ์ฑ์ฉ๊ณต๊ณ ๋ถ๋งํฌ ์ทจ์ API ๊ตฌํ
- ๋ถ๋งํฌ ์กฐํ API ๊ตฌํ
์์ฃผ
- ์ด๋ ฅ์ ์ด๋ฆ ๋ณ๊ฒฝ API ๊ตฌํ
- ๊ธฐ๋ณธ ์ด๋ ฅ์๋ก ๋ณ๊ฒฝ API ๊ตฌํ
- ์ด๋ ฅ์ ์์ฑ ์ํ ๋ณ๊ฒฝ API ๊ตฌํ
- ์ด๋ ฅ์ ์์ API ๊ตฌํ
ํจ์ด
- ํ์ฌ ์์ธ ์กฐํ API ๊ตฌํ
- ํ์ฌ ์ ๋ณด ์์ฑ API ๊ตฌํ
- ํ์ฌ ์ ๋ณด ์์ API ๊ตฌํ
- ํ์ฌ ์ ๋ณด ์ญ์ API ๊ตฌํ
์์ฃผ
- ํ์ ํํด API ๊ตฌํ
- ์ ์ ํ๋กํ ์ด๋ฏธ์ง ๋ณ๊ฒฝ API ๊ตฌํ
ํจ์ด
- ์ฑ์ฉ๊ณต๊ณ ์ข์์ ์์ฑ, ์ทจ์ ๋ฒ๊ทธ ํด๊ฒฐ
์์ฃผ
- API ๋ช ์ธ์ ์์
- GitHub Action CI ์ถ๊ฐ
ํจ์ด
- API ๋ช ์ธ์ ์์
์์ฃผ
- ์ ์ ๊ธฐ๋ณธ์ ๋ณด ์์ API ๊ตฌํ
- ์ ์ ํ๋กํ ์กฐํ API ๊ตฌํ
ํจ์ด
- ๋ฉ์ธํ๋ฉด ์ด๋ฒคํธ ์กฐํ API ๊ตฌํ
- ๋ฉ์ธํ๋ฉด ์ํฐํด ์กฐํ API ๊ตฌํ
์์ฃผ
- ํ๋กํ ์ ๋ฌธ๋ถ์ผ ์ค์ API ๊ตฌํ
- ํ๋กํ ์ ๋ณด ์กฐํ API ์ค๋ฅ ์์
- SMS ์ธ์ฆ๋ฉ์ธ์ง API๊ตฌํ(coolsms์ฌ์ฉ)
ํจ์ด
- ํ์ฌ ํ๋ก์ฐ ์ ๋ฌด ๋ฒ๊ทธ ํด๊ฒฐ
- ํน์ ์กฐ๊ฑด์ผ๋ก ํ์ฌ ์กฐํ API ๊ตฌํ
- ํน์ ํ๊ทธ๋ก ํ์ฌ ์กฐํ API ๊ตฌํ
- ํ๋ก ํธ์ ํ์ ์งํ : ํ๋ก ํธ๋ถ๊ป์ ์ด์ ๋ง ํผ๋ธ๋ฆฌ์ฑ์ ๋๋, ์ฃผ์ ํ๋ฉด ๊ด๋ จ API ๊ด๋ จ ํ์
์์ฃผ
- ์ง์ํํฉ ์กฐํ ๋ชจ๋ธ๋ง
- API ๋ช ์ธ์
- ๊ณผ์ ๋ฅผ ์ํ prod, sub ๋๋ฉ์ธ ๊ตฌํ
ํจ์ด
- ์ฑ์ฉ์ ๋ณด ์กฐํ API ๊ตฌํ
- ์งํ์ค์ธ ์ด๋ฒคํธ ์กฐํ API ๊ตฌํ
- ์ฑ์ฉ๊ณต๊ณ ์ข์์ ๋ฆฌ์คํธ ์กฐํ API ๊ตฌํ
์์ฃผ
- ERD ์์ ์ ๋ฐ๋ฅธ ๋ช๋ช๊ฐ์ API ์์ ์ค
- ๋ง๋ฌด๋ฆฌ ์์ ์ ์ํ API ๋ช ์ธ์ ๋ค๋ฌ๊ธฐ
- ๋ง๋ฌด๋ฆฌ ์ง์ ์์ ์ ๋ฆฌ ์ค(๋จ์ API ๊ฐ๋ฐ ๋ฐ ์์ ๊ณผ์ ๊ณ ๋ฏผ)
ํจ์ด
- ์นด์นด์ค OAuth ๋ก๊ทธ์ธ API ๊ตฌํ
- SMS๋ก 4์๋ฆฌ ์ธ์ฆ๋ฒํธ API(๋ค์ด๋ฒ sens์ด์ฉ) ๊ตฌํ
- ERD ํ ์ด๋ธ ์์
- 2์ฐจ ํผ๋๋ฐฑ : ERD ๊ฐ status comment ์์ , Alarm ํ ์ด๋ธ๊ณผ User ํ ์ด๋ธ ์ฐ๊ฒฐ, query string์ด ํฌํจ๋ API URL ๊ตฌ์ฒดํ
์์ฃผ
- ์์ฑ์ค์ธ ์ง์ํํฉ ์กฐํ API ๊ตฌํ
- ํ์ฌ ์ง์ ํํฉ ๋ฐํ๊ฐ ์์
- README Architecture ์ถ๊ฐ
ํจ์ด
- ํ๋ก์ฐ, ์ข์์ validation ์ถ๊ฐ
- ๊ฒ์์ด validation ์ถ๊ฐ
- API ๋ช ์ธ์ ์์ ๋ฐ ๋ณด์
๊ฐ๋ฐ ์ด์ ์ ๋ฆฌ
- git branch ์ถฉ๋
- ๋ฌธ์ : ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ ๊ฐ๋จํ ๋์ธ ๋ฌธ์ฅ์ ๊ฒฝ์ฐ inteliJ ์์์ ์ถฉ๋์ ํด๊ฒฐํ์ง ์๊ณ ๊นํ๋ธ ์์์ ํด๊ฒฐํ์๋๋ฐ, ๊ทธ๋ ๋ฏธ์ฒ ํด๊ฒฐํ์ง ๋ชปํ๋ ์ค๋ฅ๋ค์ด ec2 ์์์ build ํ ๋ ์๋ฌ๋ฅผ ๋ฟ์ด๋๋ค.
- ํด๊ฒฐ: GitHub Action์ ์ด์ฉํ CI๋ฅผ ์ ์ฉํ์ฌ, ๋ชจ๋ main branch๋ก ๋ณด๋ด๋ ๋ชจ๋ pull request์ ์ฝ๋๋ค์ ๊ฒ์ฆํ์ฌ ์๋ฌ๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ๋๋ก ํ์ฌ ๋ฒ๊ฑฐ๋ก์์ ํด๊ฒฐํ์๋ค.
- validation ์ ์ฉ์ ์ค๋ณต๋ ์ฝ๋๋ค๋ก ์ธํ ์ง์ ๋ถํจ
- ๋ฌธ์ : ๊ธฐ์กด์ ๊ฒฝ์ฐ post ์์ฒญ ์ controller ๋จ์์ ๋ชจ๋ ์กฐ๊ฑด๋ฌธ์ ๊ฑธ์ด์ค์ ํด๊ฒฐํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ก๋ค.
- ํด๊ฒฐ: @ControllerAdvice๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ์๋ฌ๋ค์ ํ๊ณณ์์ ์ฒ๋ฆฌํ๊ฒ๋ ํ์๊ณ , Dto ์์์ @valid๋ฅผ ์ด์ฉํ์ฌ ๊ฒ์ฆํ์๋ค.
- DTO ํด๋์ค์ ๊ฐฏ์ ์ฆ๊ฐ๋ก ์ธํ ์ง์ ๋ถํจ
- ๋ฌธ์ : ์ด๋ ฅ์ ์์ฑ์ ๊ฒฝ์ฐ Post๋ก ์์ฒญ๋ฐ์์ผ ํ๋ ๊ฐ์ด ๋๋ฌด ๋ง๋ค๋ณด๋ Dto ํด๋์ค ํ์ผ์ด ๋๋ฌด ๋ง์์ก๊ณ , ๊ฐ๋ ์ฑ์ด ์ค์ด๋ค๊ณ ๋ญ๊ฐ ๊ฐ์ฒด์งํฅ ์ ์ด์ง ๋ชปํ๋ค.
- ํด๊ฒฐ: inner class๋ฅผ ์ฌ์ฉํ์ฌ ํ ํด๋์ค ํ์ผ ๋ด์์ ์ ๋ถ ๊ธฐ์ ํ ์ ์๊ฒ ํด๊ฒฐํ์๋ค.
- CORS ERROR
- ๋ฌธ์ : ํด๋ผ์ด์ธํธ ์ธก์์ API์์ฒญ์ CORS ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ํด๊ฒฐ: WebConfig.class ํ์ผ์ ์์ฑํ๊ณ ์๋ ๋ฉ์๋๋ฅผ Bean ๋ฑ๋ก ํด์ค์ผ๋ก์จ ํด๊ฒฐํ๋ค.
@Configuration
public class WebConfig implements WebMvcConfigurer {
private static final long MAX_AGE_SECOND = 3600;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(MAX_AGE_SECOND);
}
}- ec2์๋ฒ์์ git pull ํ ๋ ์๋ฌ(2022-05-23)
- ๋ฌธ์ : ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ํฌํจ์ํค๊ธฐ ์ํด ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ(remote repository)์์ ์์ค๋ฅผ ๋ก๊ฒจ ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
error: Your local changes to the following files would be overwritten by merge:
logs/app.log
please commit your changes or stash them before you merge.
- ํด๊ฒฐ : merge ํ๊ธฐ ์ ์ ๋ณ๊ฒฝ์ฌํญ์ commit ํ๊ฑฐ๋ stashํ๋ค.
- ec2์๋ฒ์ ๋ฐฐํฌ(2022-05-23)
- ๋ฌธ์ : ์๊ฒฉ ์ ์์ด ๋์ด์ง๋ฉด ์๋ฒ๊ฐ ์ฃฝ์ด๋ฒ๋ฆฐ๋ค.
- ํด๊ฒฐ : nohum์ ํตํด์ ์๊ฒฉ ์ ์์ด ๋์ด์ ธ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์์ ๋์๊ฐ ์ ์๋๋ก ํ๋ค. jar ํ์ผ์ ๋์์ํฌ ๋์ ๋ช ๋ น์ด์ ์, ๋ค์ nohup, &๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
- ๋ธ๋์น ์์ฑ ์๋ฌ(2022-05-25)
- ๋ฌธ์ : ๋ก์ปฌ์์ ๋ธ๋์น๋ฅผ ์์ฑํ๊ณ ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฉ์ํค๋ ค ํ์ง๋ง ์คํจํ๋ค.
- ํด๊ฒฐ : ์๊ฒฉ ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋ธ๋์น๋ฅผ ๋จผ์ ์์ฑํ ํ ๋ก์ปฌ์์
git clone -b {branch_name} --single-branch {์ ์ฅ์ URL}
์ ํตํด ํด๋น ๋ธ๋์น๋ง ๋ฐ์จ๋ค.
- boolean ํ์ validation ์๋ฌ(2022-05-26)
- ๋ฌธ์ : ํ์ฌ ์์ฑ API ๊ตฌํ ์ค booleanํ์ ์ ์ด์ฉ์ฝ๊ด ๋ฐ ๊ฐ์ ๋์ ๋ถ๋ถ์ @AsserTrue ๋ก validationํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ํด๊ฒฐ : boolean๋์ ์ Boolean์ผ๋ก ๋ณ๊ฒฝํ๋ค.
- postman์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์คํจ ์๋ฌ(2022-05-27)
- ๋ฌธ์ : FollowService๋จ์์ ํด๋น ์ ์ ๊ฐ ํ์ฌ๋ฅผ ํ๋ก์ฐํ๊ณ ์๋์ง status๋ก ๋ฐ์์์ 0์ด์๋๋ฉด ์ด๋ฏธ ํ๋ก์ฐํ๊ณ ์๋ค๊ณ ์ฒ๋ฆฌํ์ฌ Exception์ผ๋ก ๋ ๋ ค์ฃผ๊ณ 0์ด๋ผ๋ฉด ํ๋ก์ฐํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ค์๊ณผ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
public void createFollow(int companyIdx, Long userIdx) throws BaseException {
int status = followDao.getFollowCompany(companyIdx, userIdx);
System.out.println(status);
if(status != 0 ){
throw new BaseException(POST_FOLLOW_EXISTS);
}
try{
followDao.createFollow(companyIdx, userIdx);
} catch (Exception exception) {
throw new BaseException(DATABASE_ERROR);
}
}FollowDao์์์ ์ฟผ๋ฆฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค.
public int getFollowCompany(int companyIdx, Long userIdx){
String GetFollowCompanyQuery = "select count(companyFollowIdx) from CompanyFollow where userIdx = ? and companyIdx = ? and status = 'ACTIVE'";
Object[] GetFollowCompanyParams = new Object[]{userIdx, companyIdx};
return this.jdbcTemplate.queryForObject(GetFollowCompanyQuery, int.class,GetFollowCompanyParams);
}ํ์ง๋ง ์คํํด๋ณด๋ฉด ์ค์ db์์์ ํ๋ก์ฐํ๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ status๊ฐ 0์ผ๋ก ์ถ๋ ฅ๋๊ณ postman์์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ์๋ค๋ผ๊ณ ์ถ๋ ฅ๋๋ค.
{
"isSuccess" : "false",
"code" : 4000,
"message" : "๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ์์ต๋๋ค."
}- ํด๊ฒฐ : ํด๋น ๋น์ฆ๋์ค ๋ก์ง๊ณผ ์ฝ๋ ๊ตฌ์ฑ์ Like(์ข์์)์ ๋๊ฐ์ง๋ง Like๊ด๋ จ API๋ ๋ฌธ์ ์์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ๊ณ ํด๋น ๋ก์ง๊ณผ ๊ตฌ์ฑ์ ๋ฌธ์ ์๋ค๊ณ ํ๋จํ๋ค. ์ด์ ๋ฐ๋ผ ํด๋น ์ด์๋ฅผ ํ์ฅ๋๊ป ๋ณด๊ณ ๋๋ ธ์ง๋ง ํด๊ฒฐ๋ฐฉ์์ ์ฐพ์ง ๋ชปํ๋ค. ๊ฒฐ๊ตญ, ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ ์ดํ ๋ค์ ๋ค์ ์คํํด๋ณด๋ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ค.

