-
๊ธฐ๋ณธ ๊ฐ๋ฐ ํ๊ฒฝ: Spring Web, Spring Boot Devtools(๋ณ๊ฒฝ์ฌํญ ๋ฐ์์ ์๋์ผ๋ก ์๋ฒ ์ฌ๊ฐ๋ / Only gradle(not maven) / Crome์์ Live reload ํ์ฅ ์ค์นํ๋ฉด ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ ์์ด ํ์ธ๊ฐ๋ฅ), lombok(getter, setter, RequiredArgsConstructor(final๋ก ๋ณ์ ์ค์ ์ ์์ฑ์์ ์ค์ ))
-
ํ๋ก์ ํธ ๋ด ํ์ผ ์ค๋ช
- <ํ๋ก์ ํธ๋ช > + Application.java / ์น ๊ตฌ๋
- templates ๋๋ ํฐ๋ฆฌ / HTML
- static ๋๋ ํฐ๋ฆฌ / css, js, img
- application.properties ํ์ผ / ํ๋ก์ ํธ ํ๊ฒฝ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
- src/test/java ๋๋ ํฐ๋ฆฌ / JUnit๊ณผ ์คํ๋ง๋ถํธ์ ํ ์คํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฅผ ์คํํ์ง ์์ ์ํ์์ src/main/java ๋๋ ํฐ๋ฆฌ์ ์์ฑํ ์ฝ๋๋ฅผ ํ ์คํธ
- build.gradle ํ์ผ / gradle์ ํ๊ฒฝ ํ์ผ, ํ๋ก์ ํธ์ ํ๋ฌ๊ทธ์ธ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ ๊ธฐ์
-
Spring ๊ธฐ๋ฅ
-
annotation
- @Controller / org.springframework.stereotype.Controller, ํด๋์ค๋ฅผ ์ปจํธ๋กค๋ฌ๋ก ์ง์
- @RequestMapping("/app") / org.springframework.web.bind.annotation.RequestMapping, ์์ฒญ๋ URL๊ณผ์ ๋งคํ์ ๋ด๋น(์์ฒญ ๋ฐ์ ์ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์์ผ๋ก ์ฐพ์)
- @ResponseBody / org.springframework.web.bind.annotation.ResponseBody, URL ์์ฒญ์ ๋ํ ์๋ต(return)
- @Entity / javax.persistence.Entity, ํด๋์ค๋ฅผ ์ํฐํฐ๋ก ์ง์ / ์ผ๋ฐ์ ์ผ๋ก ์ํฐํฐ์๋ Setter ๋์ lombok์ @Builder annotation์ ํตํ ๋น๋ํจํด์ ์ฌ์ฉ
- @GeneratedValue / javax.persistence.GeneratedValue, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ํด๋น ์์ฑ์ ๊ฐ์ ๋ฐ๋ก ์ธํ ํ์ง ์์๋ 1์ฉ ์๋์ผ๋ก ์ฆ๊ฐํ์ฌ ์ ์ฅ๋๋ค. strategy๋ ๊ณ ์ ๋ฒํธ๋ฅผ ์์ฑํ๋ ์ต์ ์ผ๋ก GenerationType.IDENTITY๋ ํด๋น ์ปฌ๋ผ๋ง์ ๋ ๋ฆฝ์ ์ธ ์ํ์ค๋ฅผ ์์ฑํ์ฌ ๋ฒํธ๋ฅผ ์ฆ๊ฐ์ํฌ ๋ ์ฌ์ฉํ๋ค. strategy ์ต์ ์ ์๋ตํ ๊ฒฝ์ฐ์ @GeneratedValue ์ ๋ํ ์ด์ ์ด ์ง์ ๋ ์ปฌ๋ผ๋ค์ด ๋ชจ๋ ๋์ผํ ์ํ์ค๋ก ๋ฒํธ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ผ์ ํ ์์์ ๊ณ ์ ๋ฒํธ๋ฅผ ๊ฐ์ง์ ์๊ฒ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๋ณดํต GenerationType.IDENTITY๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
- @Column / javax.persistence.Column, ์ํฐํฐ์ ์์ฑ์ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ๊ณผ ์ผ์นํ๋๋ฐ ์ปฌ๋ผ์ ์ธ๋ถ ์ค์ ์ ์ํด ์ฌ์ฉํ๋ค. length๋ ์ปฌ๋ผ์ ๊ธธ์ด๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉํ๊ณ columnDefinition์ ์ปฌ๋ผ์ ์์ฑ์ ์ ์ํ ๋ ์ฌ์ฉํ๋ค. columnDefinition = "TEXT"์ "๋ด์ฉ"์ฒ๋ผ ๊ธ์ ์๋ฅผ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. ์ํฐํฐ์ ์์ฑ์ @Column ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ํ ์ด๋ธ ์ปฌ๋ผ์ผ๋ก ์ธ์ํ๋ค. ํ ์ด๋ธ ์ปฌ๋ผ์ผ๋ก ์ธ์ํ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ์๋ง @Transient ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ๋ค.
- @Id / javax.persistence.Id, primary key๋ก ์ง์
- @ManyToOne / javax.persistence.ManyToOne, N:1 ๊ด๊ณ ์ค์ , ๋ถ๋ชจ ์์ ๊ด๊ณ
- @OneToMany / javax.persistence.OneToMany, 1:N ๊ด๊ณ ์ค์ , mappedBy - ์ฐธ์กฐ ์ํฐํฐ์ ์์ฑ๋ช , cascade - CascadeType - ์ง๋ฌธ์ด ์ญ์ ๋ ๋ ๋ต๋ณ๋ค์ ๊ฑฐ์ทจ ์ ํ(REMOVE ์ ์ฒด ์ญ์ )
- ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช / createDate ์์ฑ์ ์ค์ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ์ create_date๊ฐ ๋จ. createDate์ฒ๋ผ ๋์๋ฌธ์ ํํ์ ์นด๋ฉ์ผ์ด์ค(Camel Case) ์ด๋ฆ์ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณ๊ฒฝ๋๊ณ ์ธ๋๋ฐ(_)๋ก ๋จ์ด๊ฐ ๊ตฌ๋ถ๋์ด ์ค์ ํ ์ด๋ธ ์ปฌ๋ผ๋ช ์ด ๋๋ค.
- @SpringBootTest / org.springframework.boot.test.context.SpringBootTest, ํด๋น ํด๋์ค๊ฐ ์คํ๋ง๋ถํธ ํ ์คํธ ํด๋์ค์์ ์๋ฏธ.
- @Autowired / org.springframework.beans.factory.annotation.Autowired, ์คํ๋ง์ DI๊ธฐ๋ฅ์ผ๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ์คํ๋ง์ด ์๋์ผ๋ก ์์ฑํด์ค. ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์คํ๋ง์ ์ ๋ํ ์ด์ ์ด๋ค. ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์์๋ @Autowired ์ธ์ Setter ๋๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์๋ค. ์ํ์ฐธ์กฐ ๋ฌธ์ ์ ๊ฐ์ ์ด์ ๋ก @Autowired ๋ณด๋ค๋ ์์ฑ์๋ฅผ ํตํ ๊ฐ์ฒด ์ฃผ์ ๋ฐฉ์์ด ๊ถ์ฅ๋๋ค. ํ์ง๋ง ํ ์คํธ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ์์ฑ์๋ฅผ ํตํ ๊ฐ์ฒด์ ์ฃผ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ํ ์คํธ ์ฝ๋ ์์ฑ์์๋ง @Autowired๋ฅผ ์ฌ์ฉ
- @Test / ํด๋น ๋ฉ์๋๊ฐ ํ ์คํธ ๋ฉ์๋์์ ์๋ฏธ. ํด๋์ค๋ฅผ JUnit์ผ๋ก ์คํ ์ @Test ์ ๋ํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๊ฐ ์คํ;JUnit์ ์์ฑํ ํ ์คํธ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๋ฐ์ ํ ์คํธ ํ๋ ์์ํฌ
- @Transactional / org.springframework.transaction.annotation.Transactional, ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง DB ์ธ์ ์ด ์ ์ง๋๋ค.
- @RequiredArgsConstructor / @RequiredArgsConstructor๋ ๋กฌ๋ณต์ด ์ ๊ณตํ๋ ์ ๋ํ ์ด์ ์ผ๋ก final์ด ๋ถ์ ์์ฑ์ ํฌํจํ๋ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ์ญํ ์ ํ๋ค. ๋กฌ๋ณต์ @Getter, @Setter๊ฐ ์๋์ผ๋ก Getter, Setter ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก @RequiredArgsConstructor๋ ์๋์ผ๋ก ์์ฑ์๋ฅผ ์์ฑํ๋ค. ๋ฐ๋ผ์ ์คํ๋ง ์์กด์ฑ ์ฃผ์ ๊ท์น์ ์ํด ๊ฐ์ฒด๊ฐ ์๋์ผ๋ก ์ฃผ์ ๋๋ค.
- @Service / ํด๋น ํด๋์ค๋ฅผ ์๋น์ค๋ก ์ง์
- @PathVariable / ๊ฐ๋ณํ๋ ์์ฒญ URL์ ์ฃผ์์ ๋ณ์ ๊ฐ์ ์ป์ ๋ @RequestMapping๊ณผ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ด ๋์ผํด์ผํจ.
- @PostMapping / @RequestMapping๊ณผ ๋์ผํ๊ฒ ๋งคํ์ ๋ด๋นํ๋ ์ญํ ์ ํ์ง๋ง POST์์ฒญ๋ง ๋ฐ์๋ค์ผ ๊ฒฝ์ฐ์ ์ฌ์ฉ
- @RequestParam / ํ ํ๋ฆฟ์์ ์ ๋ ฅํ ๋ด์ฉ์ ์ป์, ํ ํ๋ฆฟ์์ ์ป๊ณ ์ํ๋ name ์์ฑ๋ช ๊ณผ ๋ณ์๋ช ์ ์ผ์น์์ผ์ผํจ.
-
assertEquals(๊ธฐ๋๊ฐ, ์ค์ ๊ฐ) / ํ ์คํธ์์ ๊ธฐ๋๊ฐ๊ณผ ์ค์ ๊ฐ์ ๋น๊ตํ๊ณ ๊ฐ์ผ๋ฉด ํ ์คํธ ํต๊ณผ, ๋ค๋ฅด๋ฉด ํ ์คํธ ์คํจ๋ก ์ฒ๋ฆฌ.
-
findAll, findById, findBySubject,
-
Optional / null๊ฐ์ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํด๋์ค, isPresent๋ก null์ด ์๋์ง ๋ง๋์ง true, false๋ฅผ ๋ฆฌํด๋ฐ์ ํ์ธ
-
ORM(object relational mapping) / java์ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋ด๋ถ์์ ์๋์ผ๋ก SQL์ฟผ๋ฆฌ๋ก ๋ณํ๋์ด ์ฒ๋ฆฌ๋จ / 'ORM์ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ์ ์๊ด ์์ด ์ผ๊ด๋ ์ฝ๋๋ฅผ ์ ์งํ ์ ์์ด์ ํ๋ก๊ทธ๋จ์ ์ ์งยท๋ณด์ํ๊ธฐ๊ฐ ํธ๋ฆฌํ๋ค. ๊ฐ๋ฐ์๊ฐ ๋ฌ๋ผ๋ ํต์ผ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๊ณ ์ค๋ฅ ๋ฐ์๋ฅ ๋ ์ค์ผ ์ ์๋ค.'
-
JPA(Java Persistence API) / JPA๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฒ๋ฆฌ(์ ์ฅ, ์กฐํ), JPA๋ ์๋ฐ ์ง์์์ ORM(Object-Relational Mapping)์ ๊ธฐ์ ํ์ค์ผ๋ก ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์ ๋ชจ์, ์ธํฐํ์ด์ค์ด๋ฏ๋ก ๊ตฌํ ํด๋์ค ํ์, JPA๋ฅผ ๊ตฌํํ ๋ํ์ ์ธ ์ค์ ํด๋์ค์๋ ํ์ด๋ฒ๋ค์ดํธ(Hibernate)๊ฐ ์๋ค.
-
H2 database / ์ฃผ๋ก ๊ฐ๋ฐ์ฉ์ด๋ ์๊ท๋ชจ ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ ํ์ผ ๊ธฐ๋ฐ์ ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค. ๊ฐ๋ฐ์์๋ H2๋ฅผ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ๊ณ ์ค์ ์ด์์์คํ ์ ์ข ๋ ๊ท๋ชจ์๋ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ํจํด.
-
Entity / ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ์๋ฐ ํด๋์ค, ๋ชจ๋ธ, ๋๋ฉ์ธ ๋ชจ๋ธ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํจ.
-
Repository / ์ํฐํฐ์ ์ํด ์์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๋ฉ์๋๋ค(์: findAll, save ๋ฑ)์ ์ฌ์ฉํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ด๋ค. ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ํ ์ด๋ธ์ ์ด๋ค ๊ฐ์ ๋ฃ๊ฑฐ๋ ๊ฐ์ ์กฐํํ๋ ๋ฑ์ CRUD(Create, Read, Update, Delete)๊ฐ ํ์ํ๋ค. ์ด ๋ ์ด๋ฌํ CRUD๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ๋ ๊ณ์ธต
-
์คํ๋ง์ ์์กด์ฑ ์ฃผ์ (Dependency Injection) ๋ฐฉ์ 3๊ฐ์ง
- @Autowired ์์ฑ - ์์ฑ์ @Autowired ์ ๋ํ ์ด์ ์ ์ ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์
- ์์ฑ์ - ์์ฑ์๋ฅผ ์์ฑํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์ (๊ถ์ฅํ๋ ๋ฐฉ์)
- Setter - Setter ๋ฉ์๋๋ฅผ ์์ฑํ์ฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์ (๋ฉ์๋์ @Autowired ์ ๋ํ ์ด์ ์ ์ฉ์ด ํ์ํ๋ค.)
-
application.properties ์ค์
- spring.h2.console.enabled - H2 ์ฝ์์ ์ ์์ ํ์ฉํ ์ง์ ์ฌ๋ถ
- spring.h2.console.path - ์ฝ์ ์ ์์ ์ํ URL ๊ฒฝ๋ก
- spring.datasource.url - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์์ ์ํ ๊ฒฝ๋ก
- spring.datasource.driverClassName - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์์ ์ฌ์ฉํ๋ ๋๋ผ์ด๋ฒ
- spring.datasource.username - ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์๋ช , ๊ธฐ๋ณธ๊ฐ = sa
- spring.datasource.password - ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ์ค์๋
- spring.jpa.properties.hibernate.dialect - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ง ์ข ๋ฅ๋ฅผ ์ค์
- spring.jpa.hibernate.ddl-auto - ์ํฐํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ์์ฑํ๋ ๊ท์น์ ์ ์, ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ณดํต update ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ณ ์ด์ํ๊ฒฝ์์๋ none ๋๋ validate ๋ชจ๋๋ฅผ ์ฌ์ฉ / none - ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค., update - ์ํฐํฐ์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ์ฉํ๋ค., validate - ๋ณ๊ฒฝ์ฌํญ์ด ์๋์ง ๊ฒ์ฌ๋ง ํ๋ค., create - ์คํ๋ง๋ถํธ ์๋ฒ๊ฐ ์์๋ ๋ ๋ชจ๋ dropํ๊ณ ๋ค์ ์์ฑํ๋ค., create-drop - create์ ๋์ผํ๋ค. ํ์ง๋ง ์ข ๋ฃ์์๋ ๋ชจ๋ drop ํ๋ค.
-
์คํ๋ง๋ถํธ์์ template์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํด์ผํจ (Thymeleaf, Mustache, Groovy, Freemarker, Velocity ๋ฑ)
-
50thk/Springboot
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
ย | ย | |||
ย | ย | |||
ย | ย | |||