레이블이 HelloWorld인 게시물을 표시합니다. 모든 게시물 표시
레이블이 HelloWorld인 게시물을 표시합니다. 모든 게시물 표시

2022년 2월 24일 목요일

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart

 

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart 

[동영상]C# 스레드(Thread),HelloWorld,ThreadStart,ParameterizedThreadStart 




C# Thread

HelloWorld


ThreadStart

ParameterizedThreadStart







C# 스레드(Thread)


  • 스레드는 하나의 프로세스(실행 중인 프로그램) 내에 존재하는 순차적인 제어의 흐름을 두기 위해 사용한다. 즉 프로세스는 하나 이상의 스레드로 이루어 진다.


  • 각 스레드는 코드, 데이터, 힙 영역은 공유하며, Stack Frame은 별도로 할당되는데 이를 Thread Stack이라하며 Thread Stack은 메소드 단위로 분리되어 할당되며 실행이 끝나면 Stack Frame은 사라진다. 


  • 멀티 스레드가 제대로 동작하기 위해서는 CPU가 여러 개 있어야 한다. 단일 CPU를 사용하게 되면 CPU는 한 번에 하나의 스레드를 사용한다. 만약 멀티 스레드로 프로그램이 실행되는 경우라면 CPU의 사용 시간을 나누어서 각각의 스레드에게 주기 때문에 단일 쓰레드와 별차이가 없다.


  • C#에서 스레드를 만들기 위해서는 기 정의된 Thread 클래스와 ThreadStart, ParameterizedThreadStart 델리게이트를 이용하면 된다. 


public delegate void ParameterizedThreadStart(object obj);

한 개의 파라미터를 object 형식으로 전달하기 때문에 여러 개의 파라미터를 전달하기 위해서는 클래스나 구조체를 만들거나 배열 등을 이용하여 전달할 수 있다. 파라미터 전달은 Thread.Start() 메소드를 호출할 때 전달한다. 


public delegate void ThreadStart();

스레드가 실행시킬 메소드가 파라미터를 받아들이지 않는 형태이며, ThreadStart를 이용해 파라미터를 전달하는 방법은 ThreadStart 델리게이트가 처다보는 메소드는 파라미터를 받아들이지 않으므로 그 메소드 안에서 다른 메소드를 호출하면서 파라미터를 전달할 수 있다.


  • C#에서 스레드를 위한 클래스들은 System.Threading 네임스페이스 안에 정의되어 있다.



[실습]

1부터 50까지의 합을 5개의 쓰레드에 나누어서 실행하고자 한다. 

첫번째 쓰레드는 1~10 까지의 합을, 두번째 쓰레드는 11~20 까지의 합을.... 다섯번째 쓰레드는 

41~50 사이의 합을 구하는데 아래 두 방법으로 프로그램을 작성하세요. 


- ParameterizedThreadStart 델리게이트를 이용하여 작성하세요. 

- ThreadStart 델리게이트를 이용하여 작성하세요


1. ParameterizedThreadStart 델리게이트를 이용하여 작성


using System;

using System.Threading;

namespace ConsoleApplication2

{

    class Program

    {

        static int mysum = 0;

        static void DoSomething(object n)

        {

            int sum = 0;

            int[] number = (int[])n;

            for (int i = number[0]; i <= number[1]; i++)

            {

                sum += i;

            }

            mysum += sum;

        }

        static void Main(string[] args)

        {

            Thread t1 = new Thread(new ParameterizedThreadStart(DoSomething));

            Thread t2 = new Thread(new ParameterizedThreadStart(DoSomething));


            Thread t3 = new Thread(new ParameterizedThreadStart(DoSomething));


            Thread t4 = new Thread(new ParameterizedThreadStart(DoSomething));

            Thread t5 = new Thread(new ParameterizedThreadStart(DoSomething));

            


            t1.Start(new int[] { 1, 10 });             t2.Start(new int[] { 11, 20 });

            t3.Start(new int[] { 21, 30 });            t4.Start(new int[] { 31, 40 });

            t5.Start(new int[] { 41, 50 });

            

            t1.Join();   t2.Join();    t3.Join();     t4.Join();       t5.Join();


            Console.Write("1부터50까지의 합은{0}::", mysum);

        }

    }

}



2. ThreadStart 델리게이트를 이용하여 작성


using System;

using System.Threading;


namespace ConsoleApplication3

{

    class Program

    {

        static int mysum = 0;

        static void Sum(object n)

        {

            int sum = 0;

            int[] number = (int[])n;

            for (int i = number[0]; i <= number[1]; i++)

            {

                sum += i;

            }

            mysum += sum;

        }


        static void Main(string[] args)

        {            

            Thread t1 = new Thread(new ThreadStart(() => Sum(new int[] { 1, 10 })));

            Thread t2 = new Thread(new ThreadStart(() => Sum(new int[] { 11, 20 })));


            Thread t3 = new Thread(new ThreadStart(() => Sum(new int[] { 21, 30 })));


            Thread t4 = new Thread(new ThreadStart(() => Sum(new int[] { 31, 40 })));

            Thread t5 = new Thread(new ThreadStart(() => Sum(new int[] { 41, 50 })));

            


            t1.Start(); t2.Start(); t3.Start(); t4.Start(); t5.Start();

            t1.Join(); t2.Join(); t3.Join(); t4.Join(); t5.Join();


            Console.WriteLine(mysum);


        }

    }

}




#시샵동영상, #스레드, #Thread, #HelloWorld, #ThreadStart,#ParameterizedThreadStart, #닷넷쓰레드, #쓰레드, #닷넷동영상, #닷넷교육, #시샵교육, 시샵동영상, 스레드, Thread, HelloWorld, ThreadStart,ParameterizedThreadStart, 닷넷쓰레드, 쓰레드, 닷넷동영상, 닷넷교육, 시샵교육, 
 

 #시샵동영상#스레드#Thread#HelloWorld#ThreadStart#ParameterizedThreadStart#닷넷쓰레드#쓰레드#닷넷동영상#닷넷교육#시샵교육시샵동영상스레드ThreadHelloWorldThreadStartParameterizedThreadStart닷넷쓰레드쓰레드닷넷동영상닷넷교육시샵교육,

2022년 1월 15일 토요일

(동영상)닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수, C#닷넷교육, 닷넷학원, 시샵학원

 (동영상)닷넷이란?  CLI, CLS, CLR, CTS, 어셈블리  VS 2022, C# HelloWorld, Main함수, C#닷넷교육, 닷넷학원, 시샵학원





이미지 썸네일 삭제
닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수

닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수C#닷넷이란?CLI, CLS, CLR, 어셈블리VS 2022, C# HelloWorld닷넷이란?(CLI, CLR, CTS, CLS)닷넷이란? 마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다.CLS(Common Language Specific…

ojc.asia

이미지 썸네일 삭제
닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수

닷넷이란? CLI, CLS, CLR, CTS, 어셈블리 VS 2022, C# HelloWorld, Main함수C#닷넷이란?CLI, CLS, CLR, 어셈블리VS 2022, C# HelloWorld닷넷이란?(CLI, CLR, CTS, CLS)닷넷이란? 마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다.CLS(Common Language Specific…

ojc.asia






닷넷이란?  CLI, CLS, CLR, CTS, 어셈블리  VS 2022, C# HelloWorld, Main함수

C#




 

닷넷이란?

CLI, CLS, CLR, 어셈블리

VS 2022, C# HelloWorld





 닷넷이란?(CLI, CLR, CTS, CLS)


  • 닷넷이란마이크로소프트에서 개발한 프로그램 개발 및 실행 환경이다. 


  • CLS(Common Language Specification) : 닷넷 컴파일러가 지원해야 하는 최소한의 표준규약으로 C#.NET, VB.NET, C++.NET, F#등 닷넷 프레임웍 언어가 반드시 지켜야 하는 언어 스펙으로 CLS를 따르는 언어라면 어떠한 언어라도 닷넷 프레임워크에서 실행가능하다.


  • CLR(Common Language Runtime) : 닷넷의 실행환경. 닷넷 언어의 컴파일된 자원들은 CLR이라는 독립적인 환경에서 실행된다. 즉 소스코드를 컴파일 하면 닷넷 어셈블리가 되는데, 이 어셈블리가 CLR 위에서 동작한다.VS 2022에서는 C#, C++, VB, F#, Python, Node.js, JavaScript, TypeScript 등의 언어를 지원한다. 사용자가 컴파일된 중간언어 파일인 .exe를 실행하면 CLR이 메모리에 로드되고 .exe를 번역하여 기계어(머신코드)로 변환 후 OS위에서 실행을 한다.






  • CTS(Common Type System) :  닷넷 호환 언어가 지켜야할 타입의 표준 규격. C#에서는 4바이트 정수를 int 라고 사용하고, VB.NET에서는 Integer라고 사용한다. 하지만 이들은 모두 닷넷의 공용 타입인 System.Int32 타입이다.


  • CLI(Common Language Infrastructure) : CTS를 명세를 포함하고 MSIL(중간언어)에 대한 코드정의, 메타데이터와 이를 포함하는 MSIL(중간언어)의 구조를 포함하여 표준사양으로 기술한다. 결국 닷넷 프레임워크는 CLI의 구현체로 보면 된다.


  • Visual Studio.NET 2022는 C#, C++, VB, F#, Python, Node.js, JavaScript, TypeScript 등 여러 언어들을 지원하며 닷넷 환경에서 어느 프로그래밍 언어로 작성하던지 컴파일 된 코드(MSIL, Microsoft Intermediate Language)는 같다는 것이 아주 강력한 특징이다. 즉 프로그래머가 가장 자신 있고 편한 언어로 개발하면 된다는 것이다. 그렇지만 대부분 C#을 많이 사용하고 있다. C#은 자바의 객체지향 특징과 C++의 강력함, VB처럼 쉬운 통합환경의 3가지 요소가 결합된 최고의 언어라고 할 수 있다. 


  • C#으로 프로그래밍을 하기 위해서는 닷넷프레임워크에 대한 이해가 우선되야 하는데 먼저 CLR(Common Language Runtime)에 대해 알아보자. CLR의 Architecture는 아래와 같다. 자바언어로 생각하면 JVM 이라고 보면 된다.



  • CLR(닷넷 환경의 런타임)은 하부구조로 OS를 가지며 OS 위에서 닷넷 Application을 실행할 수 있게 해주는 중요한 환경이다. 이 때문에 닷넷 환경하에서 어떠한 언어로 개발하던지 컴파일된 파일(중간언어, IL)은 같은 모양을 가지며 파일들은 CLR 위에서 여러 라이브러리 등을 참고해서 실행 하게 된다.


C#, HelloWorld, Main 함수


VS.NET에서 HelloWorld 작성 하기


  • Visual Studio .NET 을 실행
  • 파일 -> 새로만들기 -> 프로젝트 메뉴선택
    • (프로젝트는 c:\dotnet\project\OnjConsole1 이라고 하자)
  • Visual C#, 콘솔 응용프로그램 선택


using System;


namespace OnjConsole1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello Onj");

        }

    }

}


[실행 : Ctrl + F5]

[결과]

Hello Onj



[메인 함수에서 인자 받아 들이기]


using System;


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Hello {0}, {1}",args[0], args[1]);

        }

    }

}


[실행]

메인함수에 인자 주기 : 프로젝트에서 우측 마우스버튼 클릭 하여 속성창에서 디버그의 디버그시작프로필UI열기를 클릭하여 명령줄 인스에 메인함수에 넣어 줄 인자를 기술한다. 



onj oraclejava


[결과] Hello onj oraclejava


명령프롬프트(Command Prompt)을 이용한 컴파일


D:\dotnet\project 폴더에 Hello.cs 파일을 만들자


[Hello.cs]

class Program

{

      static void Main(string[] args)

      {

          System.Console.WriteLine("Hello {0}", args[0]);

      }

}


자바와 달라 class명이 꼭 파일명일 이유는 없다.


[명령프롬프트 컴파일]

도구 메뉴 VS2022용 개발자 명령 프롬프트


D:\dotnet\project 로 이동, D:\dotnet\project>csc Hello.cs


[실행]

D:\dotnet\project>Hello ONJ


[결과]

Hello ONJ


C#에서의 메인함수(Main)


응용프로그램의 진입점(Entry Point), 닷넷 응용프로그램을 실행 시키는 런타임인 CLR(Common Language Runtime)은 프로그램 시작을 위해 Main 함수를 호출하게 되는데 Main 함수가 바로 프로그램의 진입점이 되는 것이다. 


위 예제에서 아래와 같이 Main 함수를 정의하였다.


static void Main(string[] args)


- 메인함수 첫글자 M

메인 함수의 첫글자 'M' 은 대문자이며 나머지는 소문자.


- static : Main함수가 static로 정의된 이유는 CLR에서 객체 생성없이 바로 메인함수를 호출하기 위해서이다.

 

- args 매개변수 : Main 메소드 안의 인자로, 문자열(string) 배열을 정의하고 있는데 프로그램을 시작 시 Main 함수로 전달하고자 하는 값이 있는 경우 사용된다.  필요하지 않다면 생략해도 되고 반드시 args라고 해야 하는 것은 아니다.



- Return 타입 : 위 예제에서 Main 함수는 리턴값이 없는 void 형으로 정의되었는데 int도 가능하다. int 형으로 정의할 경우에는 통상 종료할 때의 상태를 런타임(CLR)에 알려주기 위한 것인데, 반환 값이 int 형으로 정의되면 프로그램을 호출하는 쪽으로 자신의 상태 정보를 전달할 수 있다 


  • C# 응용프로그램 종료조건

C# 응용프로그램은 Main 함수의 실행이 끝나거나, 반환(return) 될 때 종료한다.


- Main 함수는 오직 한 개

하나의 C# 응용프로그램에는 하나의 Main 메소드만 있을 수 있다.

 

 

#닷넷, #닷넷이란, #CLI, #CLS, #CLR, #CTS, #어셈블리 #VS2022, #HelloWorld, #닷넷교육, #시샵교육, 닷넷, 닷넷이란, CLI, CLS, #CLR, CTS, 어셈블리 VS2022, HelloWorld, 닷넷교육, 시샵교육


2022년 1월 8일 토요일

스프링부트 Spring Boot, HelloWorld, Spring Starter Project, spring-boot-starter-web, 자바교육, 스프링교육,JAVA학원, 스프링학원, 자바학원

 

스프링부트 Spring Boot, HelloWorld, Spring Starter Project, spring-boot-starter-web, 자바교육, 스프링교육,JAVA학원, 스프링학원, 자바학원


http://ojc.asia/bbs/board.php?bo_table=LecJpa&wr_id=360 


스프링부트 Spring Boot, HelloWorld, Spring Starter Project, spring-boot-starter-web

스프링부트 Spring Boot, HelloWorld, Spring Starter Project, spring-boot-starter-webSpring Boot기본적인 프로젝트 스캐폴딩 도구로 빠른개발을 위한 스프링 프레임워크 서브 프로젝트 중에 하나인 Spring Boot를 사용

ojc.asia

https://www.youtube.com/watch?v=cOH-DVAuBes&list=PLxU-iZCqT52Bihgf3v1bg5xEYeCwFQ_Zz&index=1 


https://www.youtube.com/watch?v=7ZDW5gOIJKs&list=PLxU-iZCqT52Bihgf3v1bg5xEYeCwFQ_Zz&index=2 


https://www.youtube.com/watch?v=PKO-e2mgQfc&list=PLxU-iZCqT52Bihgf3v1bg5xEYeCwFQ_Zz&index=3 


https://www.youtube.com/watch?v=sgJUROeXIWg&list=PLxU-iZCqT52Bihgf3v1bg5xEYeCwFQ_Zz&index=4 

Spring Boot

기본적인 프로젝트 스캐폴딩 도구로 빠른개발을 위한 스프링 프레임워크 서브 프로젝트 중에 하나인 Spring Boot를 사용하겠습니다. 스프링 부트는 Convention over Configuration개념을 적용하여 개발자가 처리해야 하는 반복적인 성격의 설정작업을 대신 수행하여 개발자의 수고를 덜어주는 기술입니다. 


최근 개발 초기단계에서부터 코드작성을 하지는 않습니다. 처음부터 코드를 작성하면 나중에 소스 코드 덩치가 커지거나 협업을 해야 하거나 배포를 해야 할 때 관리상의 문제가 많이 생긴다는 것을 개발자들은 이미 경험으로 알고 있기 때문입니다. 그러한 이유로 코드를 작성하기 전에 먼저 코드, 리소스, 디펜던시, 연동환경 및 테스트를 거친 후 배포작업을 미리 염두에 두고 구조적으로 프로젝트를 구분하는 스캐폴딩 작업을 선행합니다. 


프로젝트 관점에서 살펴보면 실제 코드를 작성하기 전에 해야 할 여러 설정 작업들이 도출 됩니다. 스프링부트는 여러 설정작업들 중 개발자를 대신해 관습을 적용하여 자동화 할 수 있는 부분들을 제공하는 기술로써, 개발자의 수고를 덜어 보다 빠른 개발이 진행될 수 있도록 해줍니다.
여러분이 Querydsl 학습에 집중할 수 있도록 스프링 부트를 스캐폴딩 툴로 사용하겠습니다.

프로젝트 생성

먼저 스프링 부트에 익숙해지기 위해서 간단한 프로젝트를 하나 만들어 보겠습니다. 전통적인 방법에 따라 브라우저가 서버에 요청하면 "Hello World" 메시지를 브라우저에게 보내주는 웹서비스를 만들어 보겠습니다.

File > New > Spring Starter Project


프로젝트명: chapter1-1

화면의 정보를 살펴봅니다. Maven을 디펜던시 및 빌드 도구로 사용하고 Jar로 패키징해서 배포합니다. 자바버전은 1.8이고 프로젝트 구성 시 패키지가 com.example로 만들어진다는 것을 알 수 있습니다. 기본 설정을 그대로 두고 "Next" 버튼을 클릭합니다.



     디펜던시 선택

다음 화면에서 왼쪽부분 ▶ 대분류 메뉴를 클릭하면 선택할 수 있는 상세 메뉴가 표시됩니다.


선택 디펜던시 : Web

"Finish" 버튼을 눌러서 스프링 부트로 프로젝트를 생성하는 작업을 마칩니다.
처음에는 로컬 저장소의 디펜던시들이 없을것이므로 첫 프로젝트는 생성완료까지 시간이 다소 걸릴 수 있습니다. 




     디펜던시 확인

pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>


<groupId>com.example</groupId>

<artifactId>boot</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>jar</packaging>


<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>1.4.1.RELEASE</version>

<relativePath /> <!-- lookup parent from repository -->

</parent>


<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

</properties>


<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

</dependencies>


<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>

</project>


스프링 부트는 web 개발의 필요한 여러 디펜던시들을 하나의 대표 디펜던시 "spring-boot-starter-web"로 한번에 모두 설정할 수 있게 해 줍니다. 더불어 디펜던시들의 버전관리도 스프링 부트가 <parent> 태그설정으로 직접 관리하므로 따로 명기할 필요가 없습니다. 스프링 부트가 디펜던시들의 버전을 관리함으로써 더 이상 개발자가 디펜던시의 충돌현상으로 머리 아플 일은 없을 것입니다.


<artifactId>spring-boot-starter-test</artifactId>

개발 시 테스트는 항상 수행되어야 하는 업무이므로 자동으로 테스트 디펜던시가 추가됩니다.


<artifactId>spring-boot-maven-plugin</artifactId>

Maven이 빌드작업을 수행함으로써 메이븐에서 스프링 부트를 다룰 수 있는 플러그인이 자동으로 추가되었습니다.


Dependency Hierarchy

pom.xml의 Dependency Hierarchy 화면을 보면 spring-boot-starter-web, spring-boot-starter-test 2개의 대표 디펜던시 밑으로 해당 개발 카테고리에 필요한 수십 개의 디펜던시들이 설정되어 있는 것을 알 수 있습니다. spring-core 디펜던시 옆에 버전 부분을 살펴보면 사용하는 스프링 버전은 4.3.3.RELEASE라는 것을 알 수 있습니다.




     프로젝트 환경설정

스프링 부트는 기본적으로 XML파일을 사용하지 않습니다. 스프링 부트는 Java-config와 어노테이션 방식의 설정을 선호합니다. 스프링 부트는 application.properties 파일이나 application.yml 파일을 자주 사용하는 기술의 설정작업을 위한 설정파일로 제공합니다. 


application.properties

프로퍼티 파일에서 #은 주석기호 입니다.

#java -jar yourapp.jar -Dserver.contextPath=/your/path/here

server.contextPath=/chapter1-1

server.port=8080


server.port 를 지정하지 않으면 디폴트로 8080 포트를 사용하므로 위 설정은 하든 안하든 결과가 같습니다. server.contextPath를 지정했으므로 웹서비스에 접속할 때 사용할 URL은 다음처럼 컨텍스트 패스까지 사용해야 합니다. 


http://localhost:8080/chapter-1


컨텍스트 패스를 명시적으로 설정하지 않는다면 도메인만 사용해서 접근해야 합니다. Jar 파일을 사용하여 기동 시 "-Dserver.contextPath=/your/path/here" 옵션을 사용하여 컨텍스트 패스를 변경할 수 있고 웹서버의 포트를 변경하고자 한다면
"-Dserver.port=8090"처럼 사용하면 됩니다.



     Presentation Layer

사용자의 요청 URL을 처리할 URL Handler인 컨트롤러 클래스를 작성합니다. 스프링 프레임워크를 사용한다면 개발자는 URL에 따라 대응하는 메소드를 작성하는 작업에만 신경쓰고 나머지는 모두 스프링이 미리 만들어 놓은 로직을 그대로 이용하는 방식으로 개발이 진행됩니다. 여기서는 컨트롤러가 환영메시지 문자열을 브라우저에게 전달하는 기능을 추가합니다.


HomeRestController.java

package com.example.common.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeRestController {

@RequestMapping("/")

public String home(){

return "welcome home";

}

}


컨트롤러 클래스에 @RestController 어노테이션을 붙였으므로 해당 클래스는 빈 컨테이너에 등록되고 URL Handler 역할을 수행합니다. @RequestMapping("/") 어노테이션 설정으로 서버에 루트("/")로 접근 시 "welcome home" 문자열을 브라우저에 전달합니다.



     테스트

스프링 부트로 프로젝트 생성 시 자동으로 만들어진 클래스 Chapter11Application.java 파일을 살펴보면 자바의 기동메소드인 main메소드가 존재합니다.
이 main메소드가 전체 애플리케이션의 엔트리 포인트입니다. 즉 프로젝트 시작을 담당하는 클래스가 노출되어 있으므로 웹서비스 시작 시 수행이 필요한 로직을 여기에 추가할 수 있습니다. 부트(Boot)라는 용어 자체가 시작이라는 의미를 갖고 있습니다.


"Run As > Java Application" 메뉴를 선택하여 웹서비스 프로그램을 기동합니다. 자바의 main 기동 메소드를 사용해 커다란 애플리케이션을 부트하는 것입니다.


http://localhost:8080/chapter1-1/ 으로 접근하여 다음 메시지를 볼 수 있는지 확인합니다.

실제로 개발자가 작업한 부분은 application.properties와 HomeRestController.java가 전부이므로 스프링 부트로 개발하면 빠르게 웹 서비스를 구축할 수 있다는 것을 알 수 있습니다.


부트 프로젝트를 기동하는 방법이 하나 더 있습니다.
"프로젝트 선택 > 마우스 오른쪽 클릭 > Run As > Spring Boot App" 메뉴를 선택해서 부트 프로젝트를 시작할 수도 있습니다.



     JSP 연동

최근에는 JSP를 대체할 수 있는 기술들이 많이 나와 있어서 JSP 사용비율이 점점 떨어지고 있는 추세입니다. 그러나 JSP가 자바표준 HTML 템플릿 엔진임에는 틀림이 없으므로 학습적인 차원에서는 여전히 중요하다고 볼 수 있습니다. 


스프링 부트에서 JSP 연동작업을 해 보도록 하겠습니다.

pom.xml

다음 디펜던시 2개를 설정파일에 추가합니다. 버전은 스프링 부트 프로젝트인 경우 명시하지 않아도 됩니다.

<!-- JSP 처리한다. -->

<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

<scope>provided</scope>

</dependency>

<!-- JSP 내에서 JSTL 확장 태그 라이브러리를 사용한다. -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

</dependency>


다음 작업으로 JSP 뷰와의 연동처리를 위한 컨트롤러를 하나 추가합니다.

HomeController.java

package com.example.common.controller;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class HomeController {

@RequestMapping("/")

public String home(){

return "welcome";

}

}


뷰의 실제 위치는 웹 루트 밑으로 여러 폴더들을 두고 그 아래에 배치하는 것이 일반적입니다. 따라서 컨트롤러에서 리턴하는 뷰의 이름은 컨텍스트 루트 다음 패스부터 view.jsp까지 명기해야 합니다. 이를 뷰의 이름만으로 짧게 리턴해도 되도록 스프링 컨트롤러가 리턴하는 문자열로 된 뷰이름을 가지고 뷰의 위치를 뷰 리졸버(View resolver)에게 문의하면 뷰의 위치를 가리키는 문자열을 완성하여 알려주는 역할을 수행하는 뷰 리졸버(View resolver) 설정을 추가합니다.


application.properties

spring.mvc.view.prefix=/WEB-INF/jsp/

spring.mvc.view.suffix=.jsp


하나의 URL 요청에 대응하는 메소드가 두 개인 경우, 어느 메소드가 처리해야 할지 판단할 수 없습니다. 현재까지 작업으로 보면 HomeController와 HomeRestController 에 각각 루트("/") 요청에 대응하는 코드가 설정되어 있습니다. 따라서 어느 하나를 수정해야 합니다. 


기존 HomeRestController.java 파일을 수정 합니다.

HomeRestController.java

package com.example.common.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeRestController {

@RequestMapping(value={"/"}, params="plain")

public String homeForPlain(){

return "welcome home";

}


@RequestMapping(value={"/"}, params="json")

public String homeForJson(){

return "{\"message\" : \"welcome home\"}";

}

}


스프링의 강력한 URL 매핑 기능 중에 전달되는 파라미터에 따라서 대응하는 메소드를 지정할 수 있는 기능을 사용합니다. 


다음 작업으로 뷰에 역할을 수행하는 JSP 파일을 작성합니다.

welcome.jsp

파일위치 : src/main/webapp/WEB-INF/jsp/welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Welcome Home</title>

</head>

<body>

<h2>welcome.jsp</h2>

</body>

</html>


    테스트

컨텍스트 패스까지 URL로 사용해서 서버에 접속하면 JSP 파일과 연동됩니다.
이 요청은 @RequestMapping("/") 설정이 붙어 있는 메소드가 처리합니다.



파라미터로 "json" 문자열을 추가하면 결과로 JSON 포맷의 문자열을 받습니다. 

@RequestMapping(value={"/"}, params="json") 설정이 붙어 있는 메소드가 처리합니다.



파라미터로 "plain" 문자열을 사용하면 결과로 평범한 문자열을 받습니다. 

@RequestMapping(value={"/"}, params="plain") 설정이 붙어 있는 메소드가 처리합니다.



지금까지 스프링 부트로 프로젝트를 만들어서 사용하는 방법을 간단히 살펴 보았습니다.

 

#스프링부트, #SpringBoot, #HelloWorld, 스프링부트, SpringBoot, HelloWorld

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...