반응형
반응형

 

1. 웹 애플리케이션, WAS, 서버의 기본 구조

웹 서비스는 클라이언트(사용자)의 요청을 받아 처리하고 응답을 보내는 과정으로 이루어집니다. 이 과정에는 주로 클라이언트, 웹 서버(Web Server), WAS(Web Application Server), **데이터베이스(Database)**라는 핵심 구성 요소들이 참여합니다.

1.1. 클라이언트 (Client)

  • 역할: 사용자가 서비스를 이용하는 접점으로, 웹 브라우저, 모바일 앱 등이 해당됩니다. 사용자의 요청을 웹 서버나 WAS로 보냅니다.

1.2. 웹 서버 (Web Server)

  • 역할:
    • 정적 콘텐츠 제공: HTML, CSS, JavaScript, 이미지 파일 등 고정된(변하지 않는) 파일을 클라이언트에게 직접 전달합니다.
    • 동적 요청 위임: 클라이언트의 요청 중 서버에서 처리해야 할 동적인 콘텐츠(예: 로그인, 데이터 조회/수정 등)는 WAS(Web Application Server)에 전달합니다.
    • 로드 밸런싱: 여러 WAS에 요청을 효율적으로 분산하여 서버의 부하를 줄이고 안정성을 높이는 역할도 수행할 수 있습니다.
  • 예시: Apache HTTP Server, Nginx 등

1.3. WAS (Web Application Server - 웹 애플리케이션 서버)

  • 역할:
    • 동적 콘텐츠 처리 및 비즈니스 로직 실행: 웹 애플리케이션의 핵심 로직을 수행합니다. 데이터베이스 연동, 복잡한 계산, 사용자 인증, 세션 관리 등 동적인 처리를 담당합니다.
    • 웹 서버 기능 포함: WAS 자체적으로도 정적 콘텐츠를 제공하는 기능이 있지만, 대규모 서비스에서는 웹 서버와 WAS를 분리하여 효율성을 높입니다.
    • 미들웨어: 클라이언트와 데이터베이스 사이에서 애플리케이션의 핵심 기능을 수행하는 중간 소프트웨어입니다.
  • 예시: Apache Tomcat, JBoss(WildFly), WebLogic, WebSphere 등 (자바 기반 웹 애플리케이션에서는 '서블릿 컨테이너' 역할을 합니다.)

1.4. 데이터베이스 (Database)

  • 역할: 웹 애플리케이션에서 필요한 데이터를 저장하고 관리합니다.
  • 예시: MySQL, PostgreSQL, Oracle, MongoDB 등

일반적인 요청 처리 흐름:

  1. 클라이언트가 웹 서버로 요청을 보냅니다.
  2. 웹 서버는 요청이 정적 콘텐츠인지 동적 콘텐츠인지 판단합니다.
    • 정적 콘텐츠인 경우 웹 서버가 직접 클라이언트에게 응답합니다.
    • 동적 콘텐츠인 경우 요청을 WAS로 전달합니다.
  3. WAS는 비즈니스 로직을 수행하고, 필요에 따라 데이터베이스와 연동하여 데이터를 처리합니다.
  4. WAS는 처리 결과를 웹 서버로 다시 전달합니다.
  5. 웹 서버는 WAS로부터 받은 응답을 최종적으로 클라이언트에게 보냅니다.

2. Spring Boot 구조일 때의 차이점 (표로 설명)

전통적인 웹 애플리케이션 구조와 Spring Boot 기반 웹 애플리케이션 구조는 WAS의 존재 방식과 배포 방식에서 가장 큰 차이를 보입니다.

구분전통적인 웹 애플리케이션 (예: Spring Framework + WAR 배포) Spring Boot 애플리케이션 (JAR 배포)

 

WAS 존재 방식 외부 WAS 필수: Apache Tomcat, Jetty, WebLogic 등 별도의 WAS를 서버에 설치하고, 그 안에 애플리케이션(.war 파일)을 배포해야 합니다. 내장 WAS 포함: 애플리케이션 자체에 Tomcat, Jetty, Undertow 등의 WAS가 내장되어 있습니다. 별도의 외부 WAS 설치가 필요 없습니다.
배포 단위 .war (Web Application Archive) 파일 .jar (Java Archive) 파일 (내장 WAS가 포함된 독립 실행 가능한 파일)
실행 방식 외부 WAS 서버를 먼저 구동한 후, 그 안에 .war 파일을 올려야 애플리케이션이 실행됩니다. java -jar your-application.jar 명령어로 바로 실행 가능합니다. 애플리케이션 자체가 서버 역할을 합니다.
서버 설정 WAS 서버 자체의 설정(포트, 컨텍스트 경로 등)을 수동으로 구성해야 하는 경우가 많습니다. 대부분의 서버 관련 설정(내장 WAS 포트 등)이 Spring Boot의 자동 설정 기능으로 처리되어, 개발자의 수동 설정 부담이 적습니다.
개발 생산성 설정 파일(XML 등)이 많아 초기 설정에 시간이 소요되고, 배포 과정이 다소 복잡할 수 있습니다. 최소한의 설정으로 빠르게 개발을 시작할 수 있으며, 배포 과정이 매우 간소화되어 개발 생산성이 높습니다.
마이크로서비스 적합성 각 서비스마다 WAS를 설치하고 관리해야 하므로, 마이크로서비스 아키텍처에 적용하기 다소 복잡할 수 있습니다. 독립 실행 가능한 JAR 파일 형태로 각 서비스가 자체 WAS를 가지므로, 마이크로서비스 아키텍처 및 컨테이너(Docker) 환경에 매우 적합합니다.
정적 콘텐츠 처리 일반적으로 웹 서버(Nginx, Apache)가 정적 콘텐츠를 처리하고, 동적 요청만 WAS로 전달합니다. Spring Boot 애플리케이션이 직접 정적 콘텐츠도 제공할 수 있습니다. 하지만 대규모 정적 콘텐츠는 여전히 별도의 웹 서버나 CDN을 활용하는 것이 효율적입니다.
 

결론적으로, Spring Boot는 내장 WAS를 통해 애플리케이션을 독립적인 실행 파일로 만들어, 개발과 배포 과정을 획기적으로 간소화하고 생산성을 높여줍니다. 이 점이 전통적인 웹 애플리케이션 구조와의 가장 큰 차이점입니다.

반응형
반응형

스프링 부트 하루만에 배우기

책 소개

하루면 대표적인 자바 프레임워크 스프링 부트 웹 어플리케이션을 만들 수 있습니다.

스프링 부트를 개발하는 데 필요한 프로그램 설치부터 스프링 부트의 구조에 대한 설명, JPA를 이용해 데이터를 다루는 법까지 익혀봅니다. 이해하기 어려운 개념 설명보다는 코드를 작성하고 개별 코드를 설명하는 방식으로 진행하므로 초보자 분들도 보다 쉽게 다가가실 수 있으리라 생각합니다. 또한 스프링 MVC와 스프링 부트 차이에 따른 개발 방식에 대해서도 설명하므로 기존에 스프링 MVC를 사용하셨던 분들이 스프링 부트에 적응하시는 데도 도움이 되시리라 믿습니다.

국내 자바 웹 개발 트렌드는 스프링 MVC에서 스프링 부트로 많이 넘어갔다고 생각합니다. 물론 이미 기존에 스프링 MVC로 구축된 프로젝트의 경우는 어쩔 수 없겠지만, 신규로 개발하는 경우 보다 설정이 간단한 스프링 부트 프로젝트를 많이 쓰는 추세입니다.

이제 우리도, 대세에 합류해 봅시다.

 

https://wikidocs.net/book/10382

 

스프링 부트 하루만에 배우기

# 책 소개 하루면 대표적인 자바 프레임워크 스프링 부트 웹 어플리케이션을 만들 수 있습니다. 스프링 부트를 개발하는 데 필요한 프로그램 설치부터 스프링 부트의 구조에 대…

wikidocs.net

 

반응형
반응형

자바-JSP-Spring 강좌

https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9

 

자바-JSP-Spring 강좌 - YouTube

 

www.youtube.com

 

반응형
반응형

[도서] 전자정부 표준프레임워크 quick start 

전자정부 표준프레임워크 퀵스타트
국내도서
저자 : 채규태,표선영
출판 : 루비페이퍼 2018.11.01
상세보기


이 책의 전반부에는 표준프레임워크의 개발 환경에 대해 다룬다. 기본적인 환경 구축을 시작으로 Eclipse 플러그인을 업데이트하는 방법, 추가적인 오픈 소스나 라이브러리를 사용하는 방법, 각종 에러가 발생했을 때 대처하는 방법 등을 설명한다. JUnit 중심의 단위 테스트 수행, PMD와 FindBugs를 사용한 코드 검증 수행, 빌드 도구 Maven의 사용, SVN으로 하는 버전 관리, CI(Continuous Integration: 지속적 통합) 도구 Hudson을 학습하며, 이를 통해 업무 자동화 시스템을 구축할 수도 있다.
이어서 중반부에는 표준프레임워크와 관련된 Spring과 MyBatis 프레임워크의 핵심 문법과 표준프레임워크가 Spring과 MyBatis를 연동하는 데 있어서 추가로 제공하는 기능과 API에 대해서 자세히 다룬다. 마지막으로 표준프레임워크만의 특징인 공통 컴포넌트에 대해 다룬다. 공통 컴포넌트를 사용하면 코드 작성 없이 많은 기능들을 프로젝트에 사용할 수 있다.

반응형
반응형

실행이 되지 않을 뿐더러... 컴파일도 되지 않는 상황이 전개되기 때문이다.
이경우는 다음과 같은 순으로 작업중인 문제의 프로젝트를 다시 빌드해볼 필요가 있다.

다음은 Package Explorer에서 수행할 수 있다. (혼선을 피하기 위해 메인메뉴의 사용 설명은 배제한다)

[1] 프로젝트 -> Run As -> Maven Clean
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Run As"메뉴를 선택한 후, 하위메뉴의 "Maven Clean"을 호출한다.
결과는 target폴더 아래에 기존의 작업결과로 작성된 모든 컴파일 및 빌드정보들을 삭제함을 확인할 수 있다.

[2] 프로젝트 -> Maven -> Update Project Configuration
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Maven"메뉴를 선택한 후, 하위메뉴의 "Update Project Configuration"을 호출한다.
망가진 프로젝트에 대해서 POM.xml에서 정의한 바대로 컴파일러, 빌드패스 등 플러그인의 환경설정을 다시 적용한다.

[3] 프로젝트 -> Maven -> Update Dependencies
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Maven"메뉴를 선택한 후, 하위메뉴의 "Update Dependencies"을 호출한다.
사용자가 작업중인 프로젝트에 대해서 사용중인 라이브러리(종속 라이브러리)를 점검하여 누락되거나 버전이 맞지 않는 경우 등을 점검한 후 Maven Repository를 새롭게 갱신한다. 즉, 사용자가 사용하는 라이브러리들이 정상적인지 점검한 후, 바로 잡는 것이다.
위 설명은 메이븐의 구버전인 경우에 해당한다. 신 버전인 경우에는 위 메뉴(Update Dependencies)가 존재하지 않는다. 아마도 "Update Project Configuration"만 수행해도 종속 라이브러리들을 갱신/관리하는듯하다.

[4] 프로젝트 -> Run As -> Maven install
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Run As"메뉴를 선택한 후, 하위메뉴의 "Maven Install"을 호출한다.개발중인 프로젝트에 메이븐을 설치(적용)한다.이때, 현재 프로젝트의 상태를 컴파일하고 배포를 위한 WAR파일까지 생성해 둔다.여기까지만 해도 프로젝트가 정상적으로 컴파일 및 실행이 되기도 한다.

[5] 프로젝트 -> Run As -> Maven Build
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Run As"메뉴를 선택한 후, 하위메뉴의 "Maven Build"을 호출한다.
프로젝트 환경설정 정보를 이용하여 Maven으로 프로젝트를 다시한번 빌드하는 것이다.
굳이 필요하지 않을 수 있으나.. 간혹 수행해야할 때도 있다.

[6] 프로젝트 -> Run As -> Run on Server
프로젝트를 선택하고 마우스 우클릭으로 팝업메뉴를 호출한다음 "Run As"메뉴를 선택한 후, 하위메뉴의 "Run on Server"을 호출한다.
프로젝트를 실행하는 것이다.
물론, 위에서 설명하지 않은 다른 방법으로 실행해도 된다.

http://m.blog.daum.net/_blog/_m/articleView.do?blogid=0XrpC&articleno=160

 

[egov/전자정부/spring] 전자정부프레임워크에서 난처한 오류 발생.. 두번째

[사담] 오랫만에 글을 공개하는 군요. 그간 꾸준히 찾아주시는 미래의 영웅들께 실질적인 도움이 될만한 글을 남기고 싶었는데... 시간이.. 마음의 여유가... 허락치 않았습니다. 조급함

blog.daum.net

 

반응형
반응형

log4j2.xml 에서 로그파일 저장, 년도/월별 폴더 생성 후 그 아래에 로그파일 일자시간별 생성 저장.

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n" />
        </Console>
        <RollingFile name="file" fileName="./logs/file/all.log" 
                   filePattern="./logs/file/$${date:yyyy}/$${date:MM}/all_%d{yyyyMMddHH}.log">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
                <Policies>
                        <TimeBasedTriggeringPolicy /><!-- Rotated everyday -->
                </Policies>
        </RollingFile>
    </Appenders>

 

<Loggers> 에서 <AppenderRef ref="file" > 이어야 파일로 저장. 

    <Loggers> 
       
        <Logger name="java.sql" level="off" additivity="false">
            <AppenderRef ref="console" />
        </Logger>
        <Logger name="egovframework" level="ERROR" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="file"/> 
        </Logger>
        <Logger name="org.springframework" level="DEBUG" additivity="false">
            <AppenderRef ref="console" /> 
            <AppenderRef ref="file"/> 
        </Logger>


        <Logger name="jdbc.sqltiming" level="off" additivity="false">

            <AppenderRef ref="console" />
        </Logger>
        <Logger name="jdbc.resultsettable" level="off" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>
        <Logger name="jdbc.sqlonly" level="info" additivity="false"> <!-- info / ERROR / DEBUG / off -->
            <AppenderRef ref="console"/>
        </Logger>

        <Root level="ERROR">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>

 

반응형

+ Recent posts