개발, 공부, 일상 블로그

[Spring] 왜 스프링 프레임워크를 사용할까? (Spring vs EJB, JavaEE)

|

☘️ 왜 스프링 프레임워크를 사용할까?

📚 시리즈 - 스프링 5.0

  1. 왜 스프링 프레임워크를 사용할까? (Spring vs EJB, JavaEE)
  2. 스프링 프레임워크의 주요 모듈들
  3. DI(Dependency Injection, 의존성 주입)와 IoC(Inversion of Control, 제어 반전)

⚽︎ 목표

본격적으로 스프링 프레임워크를 공부하기 전에, 왜 스프링이 좋은것인지 발전과정과 함께 살펴보자.

1. 스프링 프레임워크는 왜 생겼는가?

스프링 프레임워크 1.0은 2004년 3월에 릴리스됐다.
스프링이 처음 나올 당시, 자바로 엔터프라이즈 애플리케이션을 개발하는 가장 일반적인 방법은 EJB(Enterprise Java Beans)를 사용하는 것이였다.

그러나 EJB에는 단점이 있었다.

  1. 단위 테스트가 어렵다.
  2. 불필요한 메서드를 구현해야 한다.
  3. 예외 처리가 번거롭다.
  4. 배포가 불편하다.

☄️ 그 때 혜성과 같이 등장한 스프링 프레임워크

사람들은 왜 스프링 프레임워크에 열광했을까?? (지금까지도..)

스프링 프레임워크가 중요한 이유는 다음과 같다.

  1. 단순화된 단위 테스팅
  2. 복잡한 코드의 감소
  3. 아키텍처의 유연성
  4. 변화하는 시대를 선도

1. 단순화된 단위 테스팅

EJB는 단위테스트가 어렵다.

정확히 말하자면, EJB 컨테이너 외부에서 실행 하는 것이 어려웠다.
그러므로 테스트를 위해서 반드시 컨테이너에 배포해야했다.

그러나 스프링 프레임워크는 의존성 주입(Dependency Injection, DI) 이라는 개념을 도입했다.

의존성 주입(Dependency Injection, DI)

간단히 말하자면, 사용할 도구를 외부에서 지정해 주는 것이다.
DI에 대해서는 나중에 자세히 알아보자!
임시 링크

의존성 주입을 도입하면서, 단위 테스트를 위해 전체 애플리케이션을 배포할 필요가 없게 됐다.
단위 테스트 간소화의 이점은 다음과 같다.

  • 생산성 향상
  • 빠른 결함 발견 -> 수정 비용이 적음
  • 지속적인 통합(Continuous Integration, CI) 시 자동화된 단위 테스트로 향후 결함을 예방

2. 복잡한 코드의 감소

자바로 데이터베이스 연동을 해 본 사람이라면 이런 코드를 한번 쯤은 작성 해 보았을 것이다.

Connection con = null;
PreparedStatement stmt = null;

String sql = /* INSERT 문 */;

try {
    con = DriverManager.getConnection(DB_URL, DB_ID, DB_PW);
    stmt = con.prepareStatement(sql);
    stmt.setInt(1, id);
    stmt.setString(2, someValue);
    stmt.execute();
}
catch (Exception e) {
    e.printStackTrace();
}
finally {
    try {
        if (stmt != null) stmt.close();
        if (con != null) con.close();
    }
    catch (Exception e) {
        e.printStackTrace();
    }
}

이런 코드를 SQL 마다 작성해야 한다…

하지만 스프링 프레임워크의 Spring JDBC를 사용하면 다음과 같이 사용할 수 있다.

String sql = /* INSERT 문 */;
jdbcTemplate.update(sql, id, someValue);

말도 안돼...

모든 메서드에서 예외 처리를 구현하는 대신,
중앙 집중식 예외 처리를 수행하고 관점 지향 프로그래밍(Aspect Oriented Programming, AOP)을 사용해 주입할 수 있다고 한다.

나중에 자세히 알아보자!

3. 아키텍처의 유연성

유연하다는 것은 무엇일까?

유연한 사고, 남탓하지 않기

스프링 프레임워크는 모듈 방식이다.
스프링 코어 모듈 위에 독립적인 모듈을 올려 완성한다.

🧐 모듈?

모듈화 디자인이란, 한 시스템을 여러 개의 기능적 구성요소(모듈)들을 조합함으로써 완성하도록 한 설계를 말한다.

by 나무위키(꺼라)

예를 들어, 옷을 입는 것을 생각해보자.
특히 모자, 상의, 하의, 신발만 선택한다고 했을 때
우리는 다양한 조합을 생각할 수 있다.

각각의 모자, 상의, 하의, 신발들을 모듈이라고 생각해보자!

어떠한 기능(우리 예시에서는 옷입기)을 완성하는데 우리는 다양한 모듈()을 선택할 수 있다.

사실 정확한 정의(wikipedia)와는 거리가 멀다.

하지만 내가 무엇을 말하고 싶은건지 이해해줬으면 한다.

🤔 스프링 프레임워크는 그 자체로 완벽하지 않다.

이게 무슨말인가 싶겠지만, 앞서 모듈을 언급했듯이

스프링 프레임워크는 스프링 애플리케이션의 서로 다른 부분들 간의 결합을 줄이고 (모듈화를 통해), 이를 테스트할 수 있게 만드는 것에 중점을 두면서 사용자가 선택한 프레임워크와의 통합을 제공한다

이는 아키텍처에 융통성이 있다는 것이며, 여러분은 원하는 기능 구현을 위해 프레임워크를 자유롭게 선택할 수 있다.

즉, 스프링 프레임워크는 옷을 입힐 마네킹이고,
여러분들이 선택하는 여러가지 도구(모듈)들이 이다.

4. 변화하는 시대를 선도

스프링은 트렌드를 Java EE보다 빠르게 반영한다.

책에서 예로든 것들은 어노테이션, 캐싱 API, 배치 애플리케이션 스펙, 마이크로서비스 아키텍처가 있는데,
결론은 JavaEE보다 빠르게 지원했다 이므로, 굳이 정리 안했다.

📕 마무리

왜 스프링 프레임워크를 사용하는가?

기존 자바기반의 다른(EJB, JavaEE) 프레임워크들 보다
테스트하기 쉽고, 사용하기 간단하며, 유연한 아키텍처를 가졌고, 트렌드를 잘 반영하기 때문이다.

다음에는 스프링의 주요 모듈들과 스프링 프로젝트에 대해 정리해보겠다.

🚀 참고

[Github] 블로그에 댓글 기능 추가하기 (ft. Utterances)

|

✏️ 댓글 기능을 추가하자!

블로그 커스터마이징이 어느정도 마무리 되어가고 있다.
따로 포스팅은 안했지만 포스트의 오른쪽을 보면 목차가 보일 것이다.

allejo/jekyll-toc을 이용해서 구현했는데 나중에 기회가 된다면 포스팅 해보겠다.

아무튼, 댓글 기능을 추가해보려고 하는데 Jekyll 기반의 블로그의 대부분은 Disqus를 사용하는 것 같다.

😨 그러나 Disqus에는 치명적인 문제점이 있다.

  1. Disqus는 무겁다.
  2. 무료 라이센스로 사용하는 경우 광고가 붙는다.

무겁고 광고가 붙는다니… 도저히 용서할 수가 없었다.

그래서 다른 대안을 찾던 중 Utterances 라는 것을 발견하게 되었다.

✨ Utterances

Utternace 뜻

뭐.. 이런 뜻이 있다고 한다.

Utterances를 사용하면 Github 저장소의 Issue로 댓글을 관리할 수 있다.

개발 블로그 특성상, 내 블로그에 접근하는 사람들은 Github 계정이 있을 가능성이 높으니까 사용하기 좋을 것 같다.

또 이슈가 등록되면 Slack 메세지가 오게 하거나, 메일이 오게 하는 등 설정이 가능하므로 댓글 알림 기능까지 쉽게 구현 가능하다.

😏 그럼 이제 본격적으로 써보자

1. 설치

먼저 Github App에서 Utterances를 설치해야한다.

설치 페이지

설치 페이지에 접속하면 다음과 같이 나온다.
이미 설치한 경우 Configure버튼이 보이는데, 여러분들에게는 Install 버튼이 보일것이다.

Install 버튼을 누르면 저장소를 선택하는 화면이 나온다.

저장소 선택

댓글을 이슈로 관리할 저장소를 선택하면 된다.

나는 블로그 저장소를 private로 설정해놨기 때문에 댓글 관리를 위한 public 저장소를 새로 만들었다.

Install 버튼을 눌러 설치를 완료하자.

2. 설정

설치가 완료되면 설정 페이지로 이동한다.
설정 페이지에서 저장소를 설정해주자.

저장소 설정

repo에 계정명/저장소이름 을 입력하면 된다.

그 다음은 블로그 포스트와 이슈 매핑 방법에 대한 설정이다.

이슈 매핑

블로그 글 경로를 이슈의 제목으로 설정하기로 했다.
글의 제목은 빈번히 수정되어도 파일명은 수정하지 않을 것이기 때문이다.

이슈 라벨

이슈 라벨과 테마 설정이다.
굳이 설정할 필요는 없지만 구분을 위해 댓글 이슈에는 comments를 붙이도록 설정했다.
(오로지 댓글만을 위한 저장소이기 때문에 구분할 이유는 없긴하다..)

스크립트

다 입력하면 이런 스크립트가 나온다.
복사해서 _layout/post.html 에 추가할 것이다.

3. _layout/post.html에 추가

지금 사용하고 있는 테마는 기본적으로 disqus를 사용하도록 되어있다.
우리는 disqus가 필요 없으므로, 관련 코드들을 모두 주석시키자

주석

이제 그 위치에 복사한 Utterances 스크립트를 추가하자.

스크립트 추가

이제 Github 저장소에 push 하면 끝이다.

4. Github 저장소에 push

git add _layout/post.html
git commit -m "feat(comment): disqus제거하고 utterances추가"
git push origin master

커밋 메시지는 각자 방식대로 작성하자

🔎 이제 확인해보자

댓글 등록

잘된다. 마크다운도 된다. 짱이다…

이슈

이슈도가 새로 생성되었고, 이런식으로 댓글이 달린다.

쩐다...

정말 와우다..

🚀 참고

[Github] 구글 검색 엔진에 내 블로그 등록하기

|

💻 구글 검색 엔진에 등록해보자

호기롭게 블로그를 만들었다. 첫 글도 작성했고…
이제 내가 쓴 글을 확인하려고 구글 검색을 해보았다.

안나온다...

안나온다…

😨 왜 안나올까?

검색 엔진이 내 블로그의 존재를 모르기 때문이다.
그러므로 검색엔진에게 직접 내 블로그에 대해 알려줘야한다.

🧐 어떻게 알려주지…?

  1. Google Search Console속성을 추가하고 인증한다.
  2. sitemap.xml을 작성 및 등록한다.
  3. robots.txt를 작성한다.

1. Google Search Console 에 속성 추가 및 인증

접속 Google Search Console 에 접속하여 블로그 URL을 입력하자.
왼쪽 도메인 입력으로 할 경우에는 DNS 레코드에 TXT를 추가해야하는데,
우린 github.io를 이용하므로 이는 불가능하다.

따라서 오른쪽 URL 접두어에 입력한다.

인증파일 다운로드

이제 HTML 파일을 다운로드 받아서 Github 저장소에 등록하면 된다.
저장소의 루트 디렉토리에 저장하고 Github 저장소에 등록한다.

git add [HTML 파일]
git commit -m "docs: google search console 인증 파일 추가"
git push origin master

이제 확인 버튼을 누르면 소유권이 인증 된다.

소유권 인증

소유권이 인증되었다.

2. sitemap.xml 작성 및 등록

저장소의 루트 디렉토리에 sitemap.xml 파일을 생성한다.
이 파일의 내용을 붙여넣기 한다.

🧐 참고한 글

반드시 1~2행의 ---도 입력해야한다!

마찬가지로 Github 저장소에 등록해준다.

git add sitemap.xml
git commit -m "docs: sitemap.xml 추가"
git push origin master

https://블로그주소/sitemap.xml 에 접속해 sitemap.xml이 정상적으로 등록되었는지 확인한다.

이제 Google Search Console에 사이트맵을 제출하면 된다.

사이트맵

Google Search Console 에서 아까 등록한 속성을 선택하고 Sitemaps 탭으로 이동한다.

사이트맵 등록

사이트맵 URL 입력에 sitemap.xml을 입력하고 제출한다.

등록성공

성공적으로 등록되었다!

3. robots.txt 작성

robots.txt는 검색 엔진의 크롤러의 웹 문서 접근을 허가하거나 차단하기 위해 기술되는 문서이다.
자세한 내용은 로봇 배제 표준을 참고하자

일단은 모든 검색 엔진의 크롤러가 모든 문서에 접근하는 것을 허락할 것이다.

User-agent: *
Allow: /

Sitemap: http://outstanding1301.github.io/sitemap.xml

sitemap.xml 의 경로도 명시해주었다.

마찬가지로 Github 저장소에 등록하자.

git add robots.txt
git commit -m "docs: robots.txt 추가"
git push origin master

🔎 이제 구글에 내 글을 검색해보자

아직 안나온다…
완전히 등록되는데에 한 일주일 정도가 걸린다고 하니 천천히 기다려보자 :)

🚀 참고

[잡담] 🌞 2021 새해 목표

|

🌞 2021 새해 목표

🐮 새 해가 밝았다.

우선 이 글을 읽어주시는 모든 분들께

새해 복 많이받으세요!

올 해는 하얀 소의 해라고 한다. 팬톤에 따르면 얼티밋 그레이 & 일루미네이팅의 해 이기도하다.

이번엔 다들 세우신 목표 이루시길 바라며…
내가 세운 목표들을 소개 해보도록 하겠다.

✏️ 개발 공부 관련

개발 블로그 만들기

언젠간 만들어야지 했던 개발블로그를 만들어봐야겠다.
Github을 이용해서 만들어봐야겠다.

이 글은 블로그가 완성되면 올라가겠지
참고로 이 글은 2021년 1월 2일에 작성중이다.
원래 1월 1일은 쉬는 날이고, 쉬는 날엔 쉬어야 한다.

Java 다시 공부하기

자바 개발을 처음 시작한지 어느덧 10년정도 되었다.
마인크래프트 플러그인을 만들기 위해 소스코드를 보면서 공부했기 때문에 자바 자체에 대한 지식은 얕은 것 같다.
올 해 한번 깊게 공부할 필요가 있겠다.

TDD 공부하기

테스트 주도 개발 (Test Driven Development) 을 공부하고 적용해서 토이 프로젝트를 진행해봐야겠다.

DB 다시 공부하기

SQL/PL 뿐만 아니라 물리적인 설계에 대해서 다시 공부해봐야겠다.

Unix 다시 공부하기

학교에서 배울땐 참 쉬웠는데 … 시간이 지나니까
자주 사용하는 명령어 제외하고는 다 까먹었다.
다시 공부해봐야겠다.

디자인 패턴 공부하기

MVC, MVP, MVVM 등등 디자인 패턴을 공부하고 사용해봐야겠다.

Spring 공부하기

자바가 제일 익숙하면서 웹은 또 JS기반으로 공부했었다. (좋다길래..)
작년 2학기에 웹서비스프로그래밍 수업을 들으면서 JSP와 서블릿을 공부했는데 생각보다 쉽고 재밌었다. 올해는 자바 기반 웹 프레임워크인 Spring을 공부해야겠다.

토이 프로젝트 하기

작년에 하던 Express + React 기반 블로그 프로젝트는 거의 다 해놓긴 했지만 이제 재미가 없다… 새로 해야겠다.
아직 주제는 생각해보지 않았는데, 내가 하고싶고 재밌는 주제로 해야겠다.
3-5월, 6-8월, 9-11월, 12-2월 총 4개의 프로젝트를 진행해야겠다.
졸작때문에 시간이 될지는 모르겠는데, 어쨌든 시간내서 작게라도 해봐야지

우아한 테크코스 퀴즈 해결하기

🦄우아한 청강 사실 이론만 공부하고 적용하지 않으면 몇달이면 다 까먹어버린다.
3년간의 전공 수업을 통해 습득한 교훈이다. (10여년 간의 학교 수업도 마찬가지)
공부하면서 위 퀴즈들을 최대한 잘 해결해봐야겠다.
물론 피드백이 없어서 어떨 진 모르겠지만…
잘 만들었다고 뿌듯했던 코드가 시간 지나고 보면 항상 고칠 부분이 너무 많았기 때문에 어떻게든 될 것 같다.

알고리즘 문제 일주일에 3개씩 해결하기

코딩테스트를 좀 준비해야겠다. 일주일에 3개면 1년이면 156문제 정도 풀게 될 텐데 성격상 한번에 몰아서 풀 것 같다…
해결한 문제는 블로그에 정리 할 생각이다.

💎 창업/취업 관련

창업 공부하기

창업 관련 유명한 서적들을 읽으면서 창업을 위해 필요한 도구들을 마련해 놔야겠다.

창업 동아리 들어가기

학교를 다니면서 그동안 대외활동을 거의 안했는데,
동아리 활동을 하면서 대외활동도 하고 창업 관련 정보를 얻고싶다.
같이 공모전도 나갈 팀원도 구하면 좋겠다.

정보처리기사 따기

정처기 별로 필요없다는 말을 참 많이 들었는데
사람 앞 일은 모르는 거니까 따 놓으면 언젠간 쓸 일이 있겠지 싶다.
산업체 하려면 필요하기도 하니까 😏

공모전 참가하기

사실 작년에 배리어프리 공모전에 지원했었는데
서류에서 광탈해버렸다…
올 해는 좀 제대로 준비해서 결과물을 만들어 봐야겠다.

자기소개서 쓰기

학교의 도움을 받아서 그럴싸한 서류 프리패스 자소설을[서를] 집필해봐야겠다.
자소서를 써 본 경험이 많이 없어서 미리 준비해봐야겠다.

창업 아이디어 생각하기

창업이 하고싶은데 아이디어가 없다.
그러니까 1년 내내 생각을 많이 해봐야겠다.

📚 교양

한달에 책 3권 읽기

어떤 종류의 책이든지 마음의 양식을 좀 쌓아야겠다.
인문 서적도 좋고, 기술 서적도 좋고, 자기 계발서도 좋고…
특히 글쓰기, 창업 관련 책은 반드시 읽어야겠다.

토익 단어 외우기

새 해 목표에 반드시 있는 항목 중 하나이다.
새 해 목표에 매년 들어간다는 것은, 결국 매년 실패한다는 것이지만
올해는 다르다.

✋ 마무리…

2021년부터는 부지런하고 성실하게 살아보자!
(~~부터는 이라는 말은 주로 그 전엔 안 하곤 했다는 것이지만)

올해는 다르다.

[Git] 커밋 메시지 규약 정리 (the AngularJS commit conventions)

|

🚀 커밋 메시지 규약

이 문서는 the AngularJS commit conventions를 번역한 것입니다.

🖋 번역 : outstandingboy 공부하면서 번역했습니다. 입맛대로 번역된 부분이나 오역이 있을 수 있습니다.
Angular 9의 커밋 메시지 규약을 추가했습니다.

📌 목차

⚽ 목표

✔ 스크립트로 CHANGELOG.md를 작성할 수 있다.
✔ git bisect를 사용하여 중요하지 않은 커밋을 무시하게 할 수 있다. (포매팅 같은 중요하지 않은 커밋)

git bisect? 커밋의 특정 범위 내에서 이진탐색을 통해 문제가 발생한 최초의 커밋을 찾는데 도움을 주는 git의 기능

출처 : 곰돌푸우❤️ 님의 블로그

✔ 커밋 히스토리를 탐색할 때 더 좋은 정보를 제공한다.

✏ CHANGELOG.md 생성

변경 내역엔 다음 세가지 내용이 포함합니다.

  • 새로운 특징 (new features)
  • 버그 수정 (bug fixes)
  • 주요 변경 내용 (breaking changes)

배포 시 스크립트를 사용해서 관련 커밋에 대한 링크와 함께 위 내용들을 생성할 수 있습니다.
물론, 실제로 배포하기 전에 변경 내역을 수정하고 배포할 수도 있습니다.

최근 배포 이후의 제목 목록을 출력합니다.

제목(subject) : 커밋 메시지의 첫번째 줄

git log <last tag> HEAD --pretty=format:%s

이번 릴리즈의 새로운 특징들을 출력합니다.

git log <last release> HEAD --grep feature

🔨 CHANGELOG.md 를 생성하기 위한 도구

😒 중요하지 않은 커밋 식별

중요하지 않은 커밋은 주로 로직의 변화가 없는 커밋입니다.
예를 들면…

  • 포매팅 변화 (공백이나 빈 줄의 추가, 제거, 들여쓰기)
  • 세미콜론 누락
  • 주석

따라서 변경 내역을 조회할 때 위와 같이 중요하지 않은 커밋은 무시해도 됩니다.

git bisect를 사용하여 이진 탐색할 때
다음과 같이 중요하지 않은 커밋을 무시할 수 있습니다.

git bisect skip $(git rev-list --grep irrelevant <good place> HEAD)

📃 히스토리를 조회할 때 더 많은 정보를 제공

일종의 “문맥” 정보를 추가합니다.

다음은 angular의 최근 커밋들 중 일부입니다 :

  • Fix small typo in docs widget (tutorial instructions)
  • Fix test for scenario.Application - should remove old iframe
  • docs - various doc fixes
  • docs - stripping extra new lines
  • Replaced double line break with single when text is fetched from Google
  • Added support for properties in documentation

모든 메시지들이 어떤 변경이 발생했는지 명시하려 하지만
공통적인 규약이 있는 것 같지는 않습니다.

다음 메시지들을 봅시다 :

  • fix comment stripping
  • fixing broken links
  • Bit of refactoring
  • Check whether links do exist and throw exception
  • Fix sitemap include (to work on case sensitive linux)

이 메시지만 보고는 어느 부분이 변했는지 알 수 없습니다.
따라서 docs, docs-parser, compiler, senario-runner와 같이 어디가 변경됐는지 알려주는게 좋겠죠.

물론, 변경된 파일들을 일일히 찾아보면 알 수 있겠죠… 하지만 그건 느립니다.
그리고 git history들을 보면 어디가 변했는지 명시하려고 하는건 보이지만, 단지 규약이 없을 뿐입니다.


⚡ 커밋 메시지의 형식

<type>(<scope>): <short summary>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

커밋 메시지의 각 줄은 100자를 넘기지 말아야 합니다. 그래야 읽기 쉽습니다.

커밋 메시지를 작성하기 위한 도구들입니다. ✨outstandingboy’s commit script✨ IntelliJ IDEA의 Git Commit Template 플러그인

커밋 메시지 헤더 (Commit Message Header)

Angular 9 규약에서는 제목 행 (Subject Line)을 커밋 메시지 헤더 (Commit Message Header)로 정의했습니다. 또한 subject를 short summary로 표현했습니다.

커밋 메시지 헤더
<type>(<scope>): <short summary>
  │       │             │
  │       │             └─⫸ 명령문, 현재 시제로 작성합니다. 대문자를 사용하지 않으며, 마침표로 끝내지 않습니다.
  │       │
  │       └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
  │                          elements|forms|http|language-service|localize|platform-browser|
  │                          platform-browser-dynamic|platform-server|router|service-worker|
  │                          upgrade|zone.js|packaging|changelog|dev-infra|docs-infra|migrations|
  │                          ngcc|ve
  │
  └─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|test
The <type> and <summary> fields are mandatory, the (<scope>) field is optional.

커밋 메시지의 첫번째 줄인 커밋 메시지 헤더는 변화에 대한 간결한 설명을 포함합니다.

<type>에 들어갈 수 있는 항목들

  • feat : 새로운 기능 추가
  • fix : 버그 수정
  • docs : 문서 관련
  • style : 스타일 변경 (포매팅 수정, 들여쓰기 추가, …)
  • refactor : 코드 리팩토링
  • test : 테스트 관련 코드
  • build : 빌드 관련 파일 수정
  • ci : CI 설정 파일 수정
  • perf : 성능 개선
  • chore : 그 외 자잘한 수정

새로운 Angular 9 규약에서는 chore가 삭제되고, build, ci, perf가 추가되었습니다.

<scope>에 들어갈 수 있는 항목들

어디가 변경되었는지, 변경된 부분은 모두 들어갈 수 있습니다.
예를 들어, $location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, 등등…
scope는 생략 가능합니다.

이름이 들어가면 어디가 바뀌었는지 알기 쉽겠죠? 함수가 변경되었으면 함수 이름이나.. 메소드가 추가되었으면 해당 클래스 이름을 넣으면 되겠네요.

<short summary> 요약 설명

  • 명령문, 현재 시제로 작성합니다.

    예를 들어, 변경되었으면 : “change”를 사용합니다. “changed”나 “changes”를 사용하지 않습니다.

  • 첫글자를 대문자로 쓰지 마세요. 소문자로 쓰세요.
  • 마지막에 마침표(.)를 붙이지 마세요

메시지 내용 (Message Body)

  • 명령문, 현재 시제로 작성하길 권장합니다.
  • 변경한 이유와 변경 전과의 차이점을 설명합니다.

http://365git.tumblr.com/post/3308646748/writing-git-commit-messages http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html

주요 변경 내역들 (Breaking Changes)

모든 주요 변경 내역들은 다음과 함께 하단에 언급되어야 합니다.

  • 변경점 (description of the change)
  • 변경 사유 (justification)
  • 마이그레이션 지시 (migration instructions)

해결된 이슈 (Referencing Issues)

해결된 이슈는 커밋 메시지 하단에 Closes #<이슈번호> 와 같이 기록되어야 합니다.

Closes #234

해결된 이슈가 여러개인 경우는 다음과 같이 쓸 수 있습니다.

Closes #123, #245, #992

Angular 9 규약에서는 “Fixes” 키워드를 사용하기도 합니다

BREAKING CHANGE: <주요 변경 내역 요약>
<BLANK LINE>
<변경점 + 마이그레이션 지시>
<BLANK LINE>
<BLANK LINE>
Fixes #<이슈번호>
BREAKING CHANGE: isolate scope bindings definition has changed and
    the inject option for the directive controller injection was removed.
    
    To migrate the code follow the example below:
    
    Before:
    
    scope: {
      myAttr: 'attribute',
      myBind: 'bind',
      myExpression: 'expression',
      myEval: 'evaluate',
      myAccessor: 'accessor'
    }
    
    After:
    
    scope: {
      myAttr: '@',
      myBind: '@',
      myExpression: '&',
      // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
      myAccessor: '=' // in directive's template change myAccessor() to myAccessor
    }
    
    The removed `inject` wasn't generaly useful for directives so there should be no code using it.

예시

feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)
fix($compile): couple of unit tests for IE9

Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.

Closes #392
Breaks foo.bar api, foo.baz should be used instead
feat(directive): ng:disabled, ng:checked, ng:multiple, ng:readonly, ng:selected

New directives for proper binding these attributes in older browsers (IE).
Added coresponding description, live examples and e2e tests.

Closes #351
style($location): add couple of missing semi colons
docs(guide): updated fixed docs from Google Docs

Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace
feat($compile): simplify isolate scope bindings

Changed the isolate scope binding options to:
  - @attr - attribute binding (including interpolation)
  - =model - by-directional model binding
  - &expr - expression execution binding

This change simplifies the terminology as well as
number of choices available to the developer. It
also supports local name aliasing from the parent.

BREAKING CHANGE: isolate scope bindings definition has changed and
the inject option for the directive controller injection was removed.

To migrate the code follow the example below:

Before:

scope: {
  myAttr: 'attribute',
  myBind: 'bind',
  myExpression: 'expression',
  myEval: 'evaluate',
  myAccessor: 'accessor'
}

After:

scope: {
  myAttr: '@',
  myBind: '@',
  myExpression: '&',
  // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
  myAccessor: '=' // in directive's template change myAccessor() to myAccessor
}

The removed `inject` wasn't generaly useful for directives so there should be no code using it.