๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐฑ์—”๋“œ/SpringBoot

[์Šคํ”„๋ง๋ถ€ํŠธ ํ€ต์Šคํƒ€ํŠธ] ch.1 ์Šคํ”„๋ง๋ถ€ํŠธ ๋“ฑ์žฅ ๋ฐ ํ€ต์Šคํƒ€ํŠธ

by OR15A 2023. 11. 20.

์Šคํ”„๋ง๋ถ€ํŠธ ๊ฐ•์˜ ๋“ฃ๊ธฐ ์ „ ์ „์ฒด ํ๋ฆ„์„ ์žก๊ณ ์ž  ์ฑ… ํ•œ ๋ฒˆ ํ›‘๊ณ  ๊ฐ•์˜ ๋“ฃ๊ธฐ๋กœ ํ•จ

โ€‹


 

โ–ถ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ๋“ฑ์žฅ

  • ์Šคํ”„๋ง๋ถ€ํŠธ : ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋„๊ตฌ์ •๋„๋กœ ์ดํ•ดํ•˜๊ธฐ
  • ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ
  • web Framwork

โ‘ RoR (๊ฒฝ๋Ÿ‰) Ruby๋กœ ๋งŒ๋“ฆ

โ‘กFlask&Djang (๊ฒฝ๋Ÿ‰)

โ‘ขNode.js&Nest.js (๊ฒฝ๋Ÿ‰)

โ‘ฃSpring : Enterprise, ๋ฌด๊ฑฐ์›€ ⇒ (๊ฒฝ๋Ÿ‰ํ™”, ์œ„์˜ ๊ฒƒ๋“ค๊ณผ ๊ฒฝ์Ÿํ•˜๋ ค๊ณ ) ⇒ SpringBoot

 

  • ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์žฅ์ (์Šคํ”„๋ง๊ณผ์˜ ์ฐจ์ด์ )
 
์Šคํ”„๋ง๋ถ€ํŠธ
์Šคํ”„๋ง
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ž๋™ํ™” : ์Šคํƒ€ํ„ฐ๋ผ๋Š” ๊ฒƒ์„ ์ด์šฉํ•ด์„œ ํŠน์ • ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ๋”์šฑ ๊ฐ„๋‹จํžˆ ์ฒ˜๋ฆฌํ•จ(์‰ฝ๊ฒŒ ๋งํ•ด ๊ธฐ๋Šฅ๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒจํ‚ค์ง€)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ž๋™ ๊ด€๋ฆฌ : ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „์— ํ•ด๋‹นํ•˜๋Š” ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ํ˜ธํ™˜๋˜๋Š” ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•ด์คŒ
  • ๋ฉ”์ด๋ธ์˜ pom.xml์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”์ด๋ธrepository์—์„œ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ -> ์•ˆ์ „ํ•œ ๋ฒ„์ „์œผ๋กœ ๊ณจ๋ผ์„œ ์ฝ”๋“œ ๋ณต์‚ฌ -> ์ง์ ‘ ์ถ”๊ฐ€ ํ–ˆ์–ด์•ผ ํ–ˆ์Œ.
  • ๋ฒ„์ „์ด ์ผ์น˜ ํ•˜์ง€์•Š์œผ๋ฉฐ ์ผ์ผ์ด ๋งž๋Š” ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•จ
์„ค์ •์˜ ์ž๋™ํ™”
(๋นˆ ๋“ฑ๋ก)
  • ์ถ”๊ฐ€๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰์— ํ•„์š”ํ•œ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์คŒ
 
ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ
  • ๋˜‘๊ฐ™์Œ. ๋‹ค๋งŒ JUnit5
  • ๊ฐ€์งœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•จ
  • JUnit4
ํ†ฐ์บฃ
  • ํ†ฐ์บฃ์ด ๋‚ด์žฅ๋˜์–ด์žˆ์–ด์„œ ๋”ฐ๋กœ ์„ค์น˜, ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Œ. ๋น ๋ฅธ ์‹คํ–‰ ๊ฒฐ๊ณผ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•จ.
  • ํ†ฐ์บฃ์„ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•ด์•ผํ•จ.
JAR ํŒจํ‚ค์ง•
  • ๋‚ด์žฅํ†ฐ์บฃ์˜ ์žฅ์ ์œผ๋กœ JARํŒŒ์ผ๋กœ ํŒจํ‚ค์ง• ๊ฐ€๋Šฅํ•จ.
  • WARํŒŒ์ผ๋กœ ํŒจํ‚ค์ง• ํ•ด์•ผํ•จ
  • ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•

-Stater : ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ์Šคํƒ€ํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ณต

-AutoConfiguration : ๋ณ„๋„์˜ ์„ค์ • ์—†์ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋“ค์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ

-Actuater : ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ์ œ๊ณต

 

 

 

โ–ถ ํ™˜๊ฒฝ์„ค์ •

  • ์ด ์ฑ…์—์„œ๋Š” Maven๊ณผ ์ดํด๋ฆฝ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘์„ ํ•˜๋Š”๋ฐ
  • https://start.spring.io/ ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋จ
  • ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๋ชจ๋“ˆ์„ ์ฒดํฌ๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋จ.

ex) web ์„ ํƒ๋งŒ์œผ๋กœ JUnit, SpringMvc ๋“ฑ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋จ

 

 

 

โ–ถ ํ€ต ์Šคํƒ€ํŠธ(ํ”„๋กœ์ ํŠธ ๋‘˜๋Ÿฌ๋ณด๊ธฐ, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ)

  • ํ”„๋กœ์ ํŠธ์˜ ์ค‘์‹ฌ ๊ตฌ์กฐ

 

  • static : ์ •์  ์›น ๋ฆฌ์†Œ์Šค ์ €์žฅ
  • templates : ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜์˜ ์›น ๋ฆฌ์†Œ์Šค ์ €์žฅ
  • application.properties : ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•  ํ”„๋กœํผํ‹ฐ ์ •๋ณด ์ €์žฅ(๋ชจ๋“  ์„ค์ •)

 

  • ๋ฉ”์ด๋ธ์˜ ๊ฒฝ์šฐ pom.xml์—์„œ pomํŒŒ์ผ์ด ๊ณ„์ธกํ™”๋˜์–ด ์žˆ์–ด์„œ ์ƒ์† ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ทธ๋ ˆ์ด๋“ค์€ ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ์ƒ์†์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๋Œ€์‹ , ํ”„๋กœ์ ํŠธ ๊ฐ„์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

 

  • ํ†ฐ์บฃ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด์„œ main()์„ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด์žฅํ†ฐ์บฃ์ด ๋Œ์•„๊ฐ.
  • ์›น ์„œ๋ฒ„ ๊ตฌ๋™์ด ์•„๋‹Œ ๋‚ด๋ถ€ ๋™์ž‘์œผ๋กœ ์‹คํ–‰ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด application.properties์— ์„ค์ •์„ none์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋จ
spring.main.web-application-type=none
 
  • ํ†ฐ์บฃ ์„œ๋ฒ„ ํฌํŠธ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๊ด€๋ จ ํ”„๋กœํผํ‹ฐ ์ถ”๊ฐ€
server.port=8000
 

 

  • ์Šคํ”„๋ง์—์„œ๋Š” xml ์„ค์ •ํŒŒ์ผ์— ์ปดํฌํ„ดํŠธ์Šค์บ”์„ ์„ค์ •ํ•ด์•ผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์คŒ. ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” ์ง์ ‘ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋จ. → ๋ฐ”๋กœ @SpringBootApplication ๋•๋ถ„
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};
    ...
}
 
  • ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ ์• ๋„ˆํ…Œ์ด์…˜์ด ์žˆ๋Š”๋ฐ ๋นˆ ๊ด€๋ จ๋œ ์• ๋„ˆํ…Œ์ด์…˜์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•ด๋ณด๋ฉด ์ด๋ ‡๋‹ค
์• ๋„ˆํ…Œ์ด์…˜
๋นˆ ๊ด€๋ จ
ํŠน์ง•
@SpringBootConfiguration
๋นˆ์„ ์ •์˜
@Configuration์˜ ํŠน๋ณ„ํ•œ ๋ฒ„์ „,
์Šคํ”„๋ง ๋ถ€ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค๋ฅผ ์ •์˜
@EnableAutoConfiguration
๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ
์ž๋™ ๊ตฌ์„ฑ์„ ํ™œ์„ฑํ™”(ํด๋ž˜์Šค ๊ฒฝ๋กœ์™€ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ ๋นˆ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ)
ex) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—ฐ๊ฒฐ, ์›น ์„œ๋ฒ„ ์„ค์ •, ๋ณด์•ˆ ์„ค์ •
@ComponentScan
๋นˆ์œผ๋กœ ๋“ฑ๋ก
์Šคํ”„๋ง์—์„œ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ™œ์„ฑํ™”(์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•  ํด๋ž˜์Šค๋ฅผ ์ฐพ์•„์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก)
์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด ์‹œ์ž‘๋˜๋Š” ๋ฒ ์ด์ŠคํŒจํ‚ค์ง€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ

 

  • @RestController: JSP๊ฐ™์€ ๋ทฐ๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ๋Œ€์‹ ์— ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฆฌํ„ดํ•œ ๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•จ. ๋Œ€๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜ DTO(์ปฌ๋ ‰์…˜ ํ˜•ํƒœ์˜ ์ž๋ฐ”๊ฐ์ฒด). ์ž๋ฐ” ๊ฐ์ฒด์˜ ์ „๋‹ฌ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ.
  • ์ปจํŠธ๋กค๋Ÿฌ ์ˆ˜์ •์‹œ ๋งค๋ฒˆ ์• ํ”Œ๋ฆฌ์ผ€๋‹ˆ์…˜ ์žฌ์‹คํ–‰์ด ๊ท€์ฐฎ๋ฉด ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” DevTools ๊ธฐ๋Šฅ ์ด์šฉํ•˜๊ธฐ(๋ฌผ๋ก  ๊ฐœ๋ฐœ์‹œ์—๋งŒ ํ™œ์„ฑํ™” ํ•˜๊ณ  ์‹ค์ œ ์šด์˜์‹œ์—๋Š” ๋น„ํ™œ์„ฑํ™” ํ•ด์•ผํ•จ) ์•„๋ž˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•
  • Maven
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
 
  • Gradle
dependencies {
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}
 
  • ์„ค์ •ํŒŒ์ผ
spring.devtools.restart.poll-interval=1000ms
spring.devtools.restart.quiet-period=1000ms
 
  • ์ธํ…”๋ฆฌ์ œ์ด์˜ recompile๋ฐฉ๋ฒ• : ๋ฉ”๋‰ด -build-ecompile

 

 

  • ๋กฌ๋ณต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : Getter, Setter, toString ์ฝ”๋“œ ์ž๋™ ์ถ”๊ฐ€
  • @Data๋Š” ๋ชจ๋“  ์• ๋„ˆํ…Œ์ด์…˜ ๋ชจ๋‘ ํฌํ•จ(Setter ์ž๋™ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์„ ๋ณ„์ ์œผ๋กœ ์‚ฌ์šฉํ•  )