
๊นํ๋ธ์ ์ต์ํ์ง ์์์ ์๊พธ ๋ญ๊ฐ ํ์ด์ง๋์ง non-fast-forward ์ค๋ฅ๊ฐ ์์ฃผ ๋ฌ๋ค..... ใ ใ ใ ใ ์ผใ ์ผ์์ผใ ใ Advanced...๋ฅผ ๋๋ฌ์ ๊ธฐ์กด์ ์๋๊ฑฐ ํด์งํต ๋๋ฌ์ ์ญ์ ํด์ค๋ค์์ Source ref์ master๋ก ์ถ๊ฐํด์ค๋ค. ๋ง์ง๋ง์ผ๋ก Marge์์ผ์ฃผ๊ณ Push!

์คํ๋ง ์ํ๋ฆฌํฐ๋ ๋ง๊ฐํ ์ธ์ฆ๊ณผ ์ธ๊ฐ ๊ธฐ๋ฅ์ ๊ฐ์ง ์คํ๋ง ํ๋ ์์ํฌ์ด๋ค. ์ธ์ฆ์ด๋, ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋์์ ๋ํด ๋๊ตฌ์ธ์ง, ์์ ์ ์ํํด๋ ๋๋์ง ํ์ธํ๋ ๊ณผ์ ์ด๋ค. ์ธ๊ฐ๋, ์ธ์ฆ ์ดํ์ ํด๋น ๋ฆฌ์์ค์ ๋ํด ์ ๊ทผ ๊ฐ๋ฅํ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ด๋ค. ๋ณด์๊ณผ ๊ด๋ จํด์ ์ฒด๊ณ์ ์ผ๋ก ๋ง์ ์ต์ ์ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ๋ณด์ ๊ด๋ จ ๋ก์ง์ ์์ฑํ์ง ์์๋ ๋๋ค. ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํํด๋ณด์! https://console.cloud.google.com/ ๋ก ์ ์ํด์ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค. ํ๋ก์ ํธ๋ฅผ ์ ํํ ํ API ๋ฐ ์๋น์ค -> ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด OAuth ํด๋ผ์ด์ธํธ ID ํด๋ฆญ! ๋์ ํ๋ฉด ์ค ์ธ๋ถ/๋ด๋ถ๊ฐ ์๋๋ฐ ์ธ๋ถ๋ฅผ ํด๋ฆญํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ : ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋ ์ ํ๋ฆฌ์ผ์ด..

์ง์ ๋ ํ ํ๋ฆฟ ์์๊ณผ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ ธ HTML๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ ์ํํธ์จ์ด ์๋ฒ ํ ํ๋ฆฟ ์์ง - JSP(๋ช ํํ๊ฒ๋ ์๋) ..๋ฑ ํด๋ผ์ด์ธํธ ํ ํ๋ฆฟ ์์ง - React,Vue ...๋ฑ ์์ญ๊ณผ ์๋ํ๋ ๋ฐฉ์์ด ๋ค๋ฅด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์์์ ์๋ - ๋ธ๋ผ์ฐ์ ์์ ์๋๋ ๋๋ ์๋ฒ ํ ํ๋ฆฟ ์์ง์ด ์ ์ดํ ์ ์๋ค. - ์๋ฒ์์๋ Jsonํน์ xmlํ์์ ํ ์ดํฐ๋ง ์ ๋ฌํ๊ณ ํด๋ผ์ด์ธํธ์์ ์กฐ๋ฆฝํ๋ค.

๊ต์ก๊ณผ์ ๋์ ์ธ์ ๋ง๋ค์ด์ก๋์ง, ์ธ์ ์์ ๋์๋์ง์ ๋ฐ๋ฅธ ์ ์ง๋ณด์ ์ค์์ฑ์ ๋ฐฐ์ฐ์ง ๋ชปํ๋ค. ์ด์ ๋ชจ๋ธ๋งํ ๋ ๊ณ ๋ คํด์ ์ง์ผ๊ฒ ๊ตฐ... ๊ฐ์ ๋ด์ฉ์ธ๋ฐ ๋งค๋ฒ DB์ insert/update์ ํ๊ธฐ์๋ ์ฝ๋๊ฐ ์ฌ๊ธฐ์ ๊ธฐ ๋ค์ด๊ฐ๊ฒ ๋๋๊น ์์ฑ๋ ๋ ๊ฐ์ด ์์ฑ๋๋ฉด ํธ๋ฆฌํ๋ค! domain ํด๋์ BaseTimeEntityํด๋์ค๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ๋ชจ๋ Entity์ ์์ ํด๋์ค๊ฐ ๋๊ฒ ํ๋ฉด ๋๋ค. 1. @MappedSpuerclass ๋ฅผ ์ด์ฉํ๋ฉด JPA Entityํด๋์ค๋ค์ด BaseTimeEntity๋ฅผ ์์ํ ๊ฒฝ์ฐ ํ๋๋ค๋ ์ปฌ๋ผ์ผ๋ก ์ธ์ํ๋๋ก ํ๋ค. 2. @EntityListeners(AuditingEntityListener.class)๋ก ํด๋น ํด๋์ค์ Auditing๊ธฐ๋ฅ์ ํฌํจํ๋ค. 3. @CreatedDate priva..

//postRepository์์ ๋์ด์จ ๊ฒฐ๊ณผ๋ฅผ postsRepository.findAllDesc().stream() //Stream์ ํตํด map์ผ๋ก new PostsListResponseDto ์ ๋งคํ ํด์ค๋ค. //PostsListResponseDto์์๋ ํ๋ผ๋ฏธํฐ๋ก postRepository์์ ๋์ด์จ ๊ฒฐ๊ณผ Entity posts๋ฅผ ๋ฐ๊ณ ์์ผ๋ฏ๋ก //๊ฒฐ๊ณผ์ ์ผ๋ก .map(posts -> new PostsListResponseDto(posts)) .map(PostsListResponseDto::new) //collect๋ฅผ ์ฌ์ฉํด์ List๋ก ๋ณํํ๋ค. .collect(Collectors.toList()); stream์ด๋ผ๋ ๊ฒ ์๋ ๊ฒ ์กฐ์ฐจ ๋ชฐ๋ผ์ ๊ณต๋ถํ๋ฉด์ ํผ๋์ค๋ฌ์ ๋ค ๋๋ค์์ ๋ฐฐ์ด ์ ์ด ์์ผ๋. ใ ..
HTML์ ์์์๋ถํฐ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ head๊ฐ ์คํ๋๊ณ body๊ฐ ์คํ๋๋ค. js์ ์ฉ๋์ด ํฌ๋ฉด ํด์๋ก body๋ถ๋ถ์ ์คํ์ด ๋ฆ์ด์ง๊ธฐ ๋๋ฌธ์ bodyํ๋จ์ ๋๋๊ฒ ์ข๋ค css๋ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์ด๋ฏ๋ก head์์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์ข๋ค + ๋ถํธ์คํธ๋ฉ์ธ ๊ฒฝ์ฐ ์ ์ด์ฟผ๋ฆฌ์ ์์กด ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ด์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ํธ์ถํ๋๊ฒ ๋๋๋ก ์์ฑํด์ผ ํ๋ค. + Scriptlet,jstl,el์ ์๋ฒ๋จ์์ ์คํ ๋๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ Javascript์์๋ ๋ณ์๋ฅผ ์ง์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. + JAVA>JSTL>HTML>Javscript + jsp์ธ๋ถ๋ก js๋ฅผ ๋นผ๋ฉด ์๋์ํ ๊ฒ๋๋ค. ์๋ฒ๋ jsp๋ฅผ ์ฒ๋ฆฌํ์ง ์ธ๋ถ์์ ์ํฌํธ๋๋ js๋ฅผ ์ฒ๋ฆฌํ์ง๋ ์๋๋ค.

Tomcat error) java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens https ์์ฒญ์ ์๋ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ ์ ์๋ ์๋ฌ์ด๋ค. ํฐ์บฃ ์ชฝ์์ https์ค์ ์ ํด์ฃผ์ง ์์๋๋ฐ https๋ก ์์ฒญํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ ์๋ ์๋ฌ์ด๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ 1. url์ http๋ก ๋ฐ๊พธ๋ฉด ํด๊ฒฐ๋๋ค. 2. ์๋ฒ ํฌํธ๋ฅผ ๋ฐ๊ฟ ๋ณธ๋ค. 3. ํ๋ก์ธ์ค๋ฅผ ์ฐพ์์ ์ข ๋ฃ์ํจ๋ค.

JPA๊ฐ ๊ด๊ณํ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๊ฒ SQL์ ๋์ ์์ฑํ์ฌ ์คํํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์คํ๋ ์ฟผ๋ฆฌ์ ํํ๊ฐ ๊ถ๊ธํ ์ ์๋ค. application.properties๋ฅผ ๋ง๋ค์ด์ค ํ spring.jpa.show_sql = true ๋ฅผ ์์ฑํด์ค๋ค. ์ง๋!

bulid.gradle์ ์์กด์ฑ ๋ฑ๋กํ๊ธฐ Entity ํด๋์ค Entity๊ฐ not null์ผ ๊ฒฝ์ฐ Builder๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๋ ํจํด์ผ๋ก ๋ง๋ค๋ Assert.notNull(title, "title must not be null"); Assert๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์์ฑํ๋ค Postsํด๋์ค๋ก Database๋ฅผ ์ ๊ทผํ๊ฒ ํด์ค PostsRepository ์ธํฐํ์ด์ค๋ฅผ Entityํด๋์ค์ ๊ฐ์ ์์น์ ๋ง๋ค์ด์ค๋ค(*) JpaReopository ๋ฅผ ์์ํ๋ฉด ๊ธฐ๋ณธ์ ์ธ CRUD๋ฉ์๋๊ฐ ์๋์ผ๋ก ์์ฑ๋๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ํ์ธํ์!

@RunWith(SpringRunner.class) ํ ์คํธ๋ฅผ ์งํํ ๋ JUnit์ ๋ด์ฅ๋ ์คํ์ ์ธ ๋ค๋ฅธ ์คํ์๋ฅผ ์คํ ์คํ๋ง ๋ถํธ ํ ์คํธ - JUnit์ฌ์ด์ ์ฐ๊ฒฐ์ ์ญํ ์ ํจ @WebMvcTest Web์ ์ง์คํ ์ ์๋ ์ด๋ ธํ ์ด์ , @Controller,@ControllerAdvice๋ฑ Controller์์ ์ด์ฉ ๊ฐ๋ฅํ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋ค. @Autowired ๋น์ ์ฃผ์ MockMvc HTTP์ GET,POST๋ฑ์ ๋ํ ์นAPI๋ฅผ ํ ์คํธํ ๋ ์ฌ์ฉ ์ธ๋ถ์ ๊ฒฐ๊ณผ์ ํฌ๊ฒ ์์กดํ ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ํน์ ๊ฐ์ ๋ฐ์ ๋, ํน์ ์๊ฐ์๋ง ์คํ๋๋ ๊ฒฝ์ฐ ๋ฑ perform() HTTP GET,POST ์์ฒญ, ์ฒด์ด๋ ์ง์ andExpect() ์ ์ด์ฉํด์ ๋ค์ํ๊ฒ ๊ฒ์ฆํ ์ ์๋ค. assertThat()
Controller @SpringBootApplication ์คํ๋ง๋ถํธ์ ์๋ ์ค์ , ์คํ๋ง Bean ์ฝ๊ธฐ์ ์์ฑ์ ๋ชจ๋ ์๋์ผ๋ก ์ค์ ํจ ํด๋น class์ ์๋ ์์น๋ถํฐ ์ค์ ์ ์ฝ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ํญ์ ํ๋ก์ ํธ์ ์ต์๋จ์ ์์นํด์ผ ํจ. SpringBootApplication.run() ์คํ๋ง๋ถํธ์ ๋ด์ฅ was์ด๋ค. ์ธ์ฅ was๋ฅผ ์ฌ์ฉํด๋ ๋์ง๋ง ๋ด์ฅ was ์ฌ์ฉ ๊ถ๊ณ (์ธ์ ์ด๋์๋ ๊ฐ์ ํ๊ฒฝ์์ ์คํ๋ง ๋ถํธ๋ฅผ ๋ฐฐํฌ) ์ฑ๋ฅ์ ์ด์ : ํฐ์บฃ ์ญ์ ์๋ธ๋ฆฟ์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ค. ๋๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ํฌ๊ฒ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค. @RestController ์ปจํธ๋กค๋ฌ๋ฅผ JSON์ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ๋ก ๋ง๋ค์ด ์ค ์์ ์๋ @ResposeBody๋ฅผ ๊ฐ ๋ฉ์๋๋ง๋ค ์ ์ธ ํ๋๊ฒ์ ํ๋ฒ์ ์ฌ์ฉํ ์ ..

1. ๋ฌธ์ ์์ ๋ฌธ์ ์์ ์ ์์๋งํผ์ด๋ ์ด๋ ต๊ณ ์๊ฐ์ด ๋ง์ด ๋ค์ด๊ฐ๋ค. ์ฒ์์ผ๋ก ๊ฐ๋ฐ ์์ ๋ณด๊ณ ์๋ก ์ญํ ๋ถ๋ด, ์ผ์ , ์์คํ ๊ตฌ์ฑ๋, ๊ตฌํ์ ์์ฑํ์๋ค. ํ์์์ ๊ฐ์ด ๋ฐฐ์ด ์ธ์ด์ ๊ฐ๋ฐ๋๊ตฌ๋ฅผ ์ฌ์ฉ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ ต์ง ์์๋ค. ์ญํ ๋ถ๋ด์์ ๊ฐ์ธ์ ์ญ๋ ์ฐจ์ด ๋๋ฌธ์ ์กฐ๊ธ ์๊ฐ์ด ์ง์ฒด๋์์ง๋ง, ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ์ถ๊ฐ, ์์ ๋์๋ค. ๊ทธ ํ ๊ธฐ๋ฅ์ ์์ (FBS)๋ฅผ ์์ํ๋ฉฐ ์ ๋ง ํ๋ค์๋ค... ๊ทธ ํ์ ๋ง๋ ๋ฌธ์์์ ์กฐ๊ธ์ด๋ผ๋ ๋ฐ๋๋ฉด FBS๋ ๋ฐ๊ฟ์ผ ํ๋ ์ํฉ์ด์ด์ ์ฒ์ ๊ณํํ ๋ ์ข ๋ ์ ์คํ์ด์ผ ํ๋ค๋ ๊ฑธ ๋ผ์ ๋ฆฌ๊ฒ ๋๊ผ๋ค... ๊ตฌํ๋์ด์ผ ํ ๊ธฐ๋ฅ์ด ํ๋ํ๋ ๋์ด๋์ด์๋ค. ๋๋ง์ ์๊ตฌ์ฌํญ ๋ช ์ธ์ , ๊ฐ์ฅ ์๊ฐ์ ๋ง์ด ์์๋ถ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ๊ฐ๋ฐํ ๋ ๋ฌด์ฒ ๋์์ด ๋ง์ด ๋์๋ค. ํ ํ๋ก์ ํธ์ด๋ค ๋ณด๋ ์๋ก ..