๐ŸŒˆ [Section4] 14. [Solo Project] To-Do App

ํ˜„์ฃผยท2022๋…„ 12์›” 14์ผ
0

bootcamp

๋ชฉ๋ก ๋ณด๊ธฐ
68/71

๐Ÿ“• ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ!

  • To-Do App ๋งŒ๋“ค๊ธฐ
  • Tomcat ์„ค์น˜ ํ›„ ์ˆ˜๋™๋ฐฐํฌ
  • Ngrok ์‚ฌ์šฉ

๐Ÿ˜œ ์‹ค์Šต

๐ŸŽ„ To-Do App ๋งŒ๋“ค๊ธฐ

โœ” ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

  • Create

    • ํ•  ์ผ ๋ชฉ๋ก์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • Read

    • ๋“ฑ๋ก๋œ ์ „์ฒด ํ•  ์ผ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
    • ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ํ•  ์ผ์˜ ํŠน์ • id๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • Update

    • ์ด๋ฏธ ํ•œ ์ผ์—๋Š” ์™„๋ฃŒ ํ‘œ์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
    • ํ•  ์ผ์˜ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • Delete

    • ๋“ฑ๋ก๋œ ์ „์ฒด ํ•  ์ผ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
    • ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ํ•  ์ผ์˜ ํŠน์ • id๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

โœ” ๊ฒฐ๊ณผ

๋จผ์ € ํ”„๋กœ์ ํŠธ๋ฅผ ๋Œ๋ฆฌ๊ณ 

Postman์œผ๋กœ ์š”์ฒญ์„ ๋‘๊ฐ€์ง€ ๋ณด๋‚ธ ํ›„์—

h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ™•์ธํ•˜๋ฉด ์ž˜ ๋“ค์–ด๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ 

์›น ์ƒ์œผ๋กœ๋„ ๊ทธ ์ •๋ณด๊ฐ€ ์ž˜ ์ „๋‹ฌ๋˜์–ด ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค !!

์—ฌ๊ธฐ์„œ todo๋ฅผ ์™„๋ฃŒํ•จ์œผ๋กœ ์ฒดํฌํ•˜๊ฒŒ ๋˜๋ฉด

๋‹ค์‹œ h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•ด๋‹น todo์˜ ์ƒํƒœ๊ฐ€ TRUE๋กœ ๋ฐ”๋€Œ์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค !!

Controller ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ๋ชจ๋‘ ์™„๋ฃŒ !

===============================================================

โœ” Tomcat์„ ์ด์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰

  1. JRE ์„ค์น˜ ํ›„, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

  2. ํ†ฐ์บฃ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ์„ค์น˜
    ( ๋‚˜๋Š” c๋“œ๋ผ์ด๋ธŒ์— ์„ค์น˜ํ•จ ! )

    • bin
      โžœ ํ†ฐ์บฃ์˜ ์‹คํ–‰ / ์ข…๋ฃŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋“ค์–ด์žˆ์Œ
    • conf
      โžœ ์„œ๋ฒ„ ์„ค์ • ํŒŒ์ผ ๋“ค์–ด์žˆ์Œ
    • webapps
      โžœ ํ†ฐ์บฃ ์œ„์—์„œ ์‹คํ–‰ํ•  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ณธ ์ €์žฅ ๊ฒฝ๋กœ
      โžœ .war ํŒŒ์ผ์„ ์ด ๊ณณ์— ์ด๋™์‹œํ‚ค๊ฑฐ๋‚˜, ์„ค์ •ํŒŒ์ผ์—์„œ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ
  3. ์„ค์น˜ํ•˜๊ณ  cmd ํ„ฐ๋ฏธ๋„์—์„œ startup.bat ๋ช…๋ น์–ด๋กœ tomcat์„ ์‹คํ–‰์‹œํ‚จ ํ›„,
    localhost:8080์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด tomcat ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์Œ !

( ๊ทธ๋ฆฌ๊ณ  ์ผ๋‹จ .\shutdown.bat ๋ช…๋ น์–ด๋กœ tomcat ์ข…๋ฃŒํ•˜๊ณ  )

  1. ํ”„๋กœ์ ํŠธ์˜ build.gradle์˜ plugins ๋ถ€๋ถ„์— ์•„๋ž˜ ์„ค์ • ์ถ”๊ฐ€ ํ›„ refresh

    plugins {
    	...
    	id 'war' // ์ถ”๊ฐ€
    }
  2. ~~Application ํŒŒ์ผ์— extends SpringBootServletInitializer ํ•ด์ฃผ๊ณ 
    config๋ฅผ Override ํ•ด์ฃผ๊ธฐ

@SpringBootApplication
public class Todo1Application extends SpringBootServletInitializer {

	public static void main(String[] args) {
		SpringApplication.run(Todo1Application.class, args);
	}

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { // (2)
		return builder.sources(Todo1Application.class);
        // return๋˜๋Š” ๊ฐ’์˜ ํด๋ž˜์Šค ์ด๋ฆ„ == ๋‚ด ~~Application ํด๋ž˜์Šค ์ด๋ฆ„์ž„
	}
}
  1. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ํ›„, ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๋‚ด์˜ build/libs ํด๋”์— ๋“ค์–ด๊ฐ€๋ฉด .war ๋กœ ์ƒ์„ฑ๋œ build ํŒŒ์ผ์ด ์žˆ์Œ!

  2. ํ•ด๋‹น ํŒŒ์ผ์„ tomcat์ด ์„ค์น˜๋œ ๊ฒฝ๋กœ์˜ webapps ํด๋” ๋‚ด๋กœ ๊ฐ€์ ธ์˜ด

  3. war ํŒŒ์ผ์˜ ์ด๋ฆ„์ด ROOT์ธ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๋ณ€๊ฒฝ ์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ๋ฐ,
    ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— conf/server.xml ํŒŒ์ผ์— ์ถ”๊ฐ€ ์„ค์ • ์ถ”๊ฐ€
    ( + tomcat ์‹คํ–‰ ํฌํŠธ๋„ 8090์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ ( ํ”„๋กœ์ ํŠธ๋ž‘ ํฌํŠธ๊ฐ€ ๊ฐ™์œผ๋‹ˆ๊นŒ ))

...
<Connector port="8090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
// ํฌํŠธ ๋ณ€๊ฒฝ
...
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
        <Context path="/" docBase="todo1-0.0.1-SNAPSHOT"  reloadable="false" > </Context>
  // docBase ๋ถ€๋ถ„์€ ๋‚ด .war ํŒŒ์ผ ๋ช…
        โ €
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
...
  1. ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๋‚˜๋ฉด webapps ํด๋” ๋‚ด์— ๋‚ด .war ํŒŒ์ผ์„ ์••์ถ•ํ•ด์ œํ•˜์—ฌ
    ์•„๋ž˜์ฒ˜๋Ÿผ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋จ

  1. ๋‹ค์‹œ tomcat ์‹คํ–‰ ํ›„, http://localhost:8090์œผ๋กœ ์ ‘์†ํ•˜๋ฉด
    webapps ๋””๋ ‰ํ† ๋ฆฌ์— ์˜ฎ๊ฒจ๋†“์€ .war ํŒŒ์ผ์ด ์‹คํ–‰๋˜์—ˆ์Œ์„ ํ™•์ธ ๊ฐ€๋Šฅ !!

( ๋‚˜ํƒ€๋‚œ ํ™”๋ฉด์ด ์—๋Ÿฌ๊ฐ™์ด ์ƒ๊ฒผ์ง€๋งŒ, ๋‚ด๊ฐ€ ๋”ฐ๋กœ ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚  ๊ฒƒ๋“ค์„ ์•ˆ์ •ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ ! )

=======================================================================

โœ” Ngrok์„ ์ด์šฉํ•ด ๋กœ์ปฌ์—์„œ ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

โœ๏ธ Ngrok

  • ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ฐฉํ™”๋ฒฝ์„ ๋„˜์–ด ์™ธ๋ถ€์—์„œ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ„ฐ๋„๋ง ํ”„๋กœ๊ทธ๋žจ
    โ €
  • ๋ฌด๋ฃŒ ํ”Œ๋žœ์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์„ธ์…˜์ด ์•ฝ 2์‹œ๊ฐ„๊ฐ€๋Ÿ‰ ์œ ์ง€๋จ
    ( AuthToken ๋“ฑ๋ก์‹œ ์‹œ๊ฐ„ ์ œํ•œ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ )
    โžœ ๊ฐœ๋ฐœ ๋ชฉ์ ์œผ๋กœ ์ž„์‹œ ๋„๋ฉ”์ธ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ํ…Œ์ŠคํŒ…ํ•˜๊ธฐ์— ์œ ์šฉ
    โ €
  • ๊ฐœ๋ฐœ ์˜์—ญ์ด ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ ํ†ต์‹ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ
    โ €
    ๐Ÿ‘‰ ํ”„๋กœ์ ํŠธ ๋•Œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž„์‹œ ๋„๋ฉ”์ธ์œผ๋กœ ๋‚ด ๋กœ์ปฌ ํ™˜๊ฒฝ์— ์ ‘์†ํ•˜์—ฌ ํ†ต์‹  ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ์Œ !
    โ €
    [์ฐธ๊ณ ] https://ngrok.com/docs/secure-tunnels#what-are-ngrok-secure-tunnels
  1. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ngrok ์„ค์น˜ !

  2. ์••์ถ• ํ•ด์ œ ํ›„์— ngrok.exe ์‹คํ–‰

  3. ngrok http 8080 ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Forwarding ๋ถ€๋ถ„์— ๊ฐ€์ƒ ์ฃผ์†Œ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

  4. ์ดํ›„ postman์—์„œ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ์Œ ! ใ…Žใ…Ž
    ( ์ธํ„ฐ๋„ท์œผ๋กœ ์ฃผ์†Œ๋ฅผ ์น˜๊ณ  ๋“ค์–ด๊ฐ€๋„ ๊ฐ€๋Šฅ ! )

  5. ๊ทธ๋ฆฌ๊ณ  ngrok ํ„ฐ๋ฏธ๋„์„ ๋ณด๋ฉด ๋‚ด๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ๋“ค์˜ ์ƒํƒœ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜ํƒ€๋‚ฌ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿ’ฅ ngrok ์‚ฌ์šฉ ์‹œ CORS ์—๋Ÿฌ

โžœ ngrok ์ด์šฉํ•ด์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ์›น์—์„œ ๋„์šฐ๊ณ  post ์š”์ฒญ์„ ํ–ˆ๋Š”๋ฐ CORS ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค !
ํ  ๋‚˜๋Š” ๋ถ„๋ช… @CrossOrigin ์• ๋„ˆํ…Œ์ด์…˜๋„ ๋„ฃ๊ณ  WebConfig ํด๋ž˜์Šค๋„ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ์ •๋ง ์ด์ƒํ•œ ์ผ์ด์—ˆ๋‹ค..!!
โ €

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• )

โžœ ํ™ˆํŽ˜์ด์ง€ ๋กœ๊ทธ์ธํ•ด์„œ ํ† ํฐ์„ ๋ฐœ๊ธ‰ ๋ฐ›๊ณ ,
ngrok config add-authtoken ๋‚ดํ† ํฐ ๋ช…๋ น์–ด๋กœ ํ† ํฐ์„ ์ถ”๊ฐ€ํ•ด์ค€ ํ›„์—,
ngrok http --host-header=rewrite 8080 ์ด ๋ช…๋ น์–ด๋กœ 8080 ํฌํŠธ์˜ ๊ฐ€์ƒ ์„œ๋ฒ„ ์ฃผ์†Œ ๋ฐ›๊ธฐ !
์ด ํ›„ ๋‚˜์˜ค๋Š” ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ€๋ฉด CORS ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  ์š”์ฒญ/์‘๋‹ต์ด ์ž˜ ์˜จ๋‹ค.
๋Œ€์ถฉ ngrok๊ฐ€ ์š”์ฒญ์„ ๋Œ€์‹  ๋ฐ›๋Š”๋ฐ ๋ง‰์•„์„œ ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค !


๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๋‚ด ํŒŒ์ผ๋“ค ์„ค๋ช…

  • .gradle
    โžœ gradle ์ด ์‚ฌ์šฉํ•˜๋Š” ํด๋”
    โžœ task ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋จ
    โžœ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธ์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Œ

  • .idea
    โžœ ๋กœ์ปฌ IntelliJ IDE ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ ํด๋”

  • gradle
    โžœ gradle ์ด ์‚ฌ์šฉํ•˜๋Š” ํด๋”
    โžœ gradle ํ™˜๊ฒฝ์„ ์ •๋ฆฌํ•œ wrapper ํŒŒ์ผ์ด ์ €์žฅ๋˜์–ด ์žˆ์Œ

  • src
    โžœ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ๊ฐ์ข… ์†Œ์Šค์ฝ”๋“œ์™€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์ด ๋“ค์–ด๊ฐ€ ์žˆ์Œ

  • main
    โžœ java ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ์Œ

  • test
    โžœ test ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ์Œ

  • .gitignore
    โžœ git ์ด ๋ฌด์‹œํ•  ํŒŒ์ผ๋“ค์„ ๋ช…์‹œํ•œ ๊ฒƒ

  • build.gradle
    โžœ gradle ์˜ ๋นŒ๋“œ ์„ค์ • ํŒŒ์ผ
    โžœ groovy ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Œ
    โžœ ์—ฌ๊ธฐ์— dependency ๋ช…์‹œ

  • gradlew
    โžœ gradle ์˜ ๋ช…๋ น ํŒŒ์ผ ( macOS / Linux ์šฉ )

  • gradle.bat
    โžœ gradle ์˜ ๋ช…๋ น ํŒŒ์ผ ( windows ์šฉ )

  • setting.gradle
    โžœ ํ”„๋กœ์ ํŠธ ์„ค์ • ์ •๋ณด ํŒŒ์ผ


๐ŸŒˆ ๋Š๋‚€์ 

์ด๋ฒˆ์—๋Š” ๋‚ด๊ฐ€ ์ง์ ‘ To-Do App์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋(์•„๋งˆ๋„ ๋ ใ… )๊นŒ์ง€ ๋งŒ๋“ค์–ด๋ดค๋Š”๋ฐ
์‚ฌ์‹ค ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ์–ด์ผ€ํ•ด.. ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ
์ƒ๊ฐ๋ณด๋‹ค ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ๋“ค์„ ์จ๋จน์œผ๋‹ˆ๊นŒ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฑฐ๊ตฌ๋‚˜ ~ ํ•˜๋Š” ๊ฐ์ด ์žกํ˜”๋‹ค !!
๊ทธ๋ž˜์„œ ๋ฌผ๋ก  ์•„์˜ˆ ์•ˆ๋ณด๊ณ  ๋‚ด ์ƒ๊ฐ๋Œ€๋กœ๋งŒ ํ•œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ
๊ทธ๋ž˜๋„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฐ์„ ์žก์•˜๋‹ค!!
์‚ฌ์‹ค ์ด๊ฒŒ postman / h2 / ์›น ์ƒ์—์„œ๋Š” ์š”์ฒญ ์‘๋‹ต์ด ์ž˜ ์˜ค๊ธด ํ•˜๋Š”๋ฐ
์•„์ง๊นŒ์ง€๋Š” h2์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์›น ์ƒ์œผ๋กœ ๋“ค์–ด๊ฐ”์„ ๋•Œ ๋‚จ์•„์žˆ์ง€ ์•Š๊ณ , ์›น ์ƒ์—์„œ ์ถ”๊ฐ€๋ฅผ ํ•ด๋„ h2์— ๋“ค์–ด๊ฐ€์ง€๋ฅผ ์•Š์•„์„œ ๋” ๋ฆฌํŒฉํ† ๋ง ํ•  ๊ฒƒ์ด๋‹ค ใ… ใ…œ

0๊ฐœ์˜ ๋Œ“๊ธ€