728x90

★ JAR 과 WAR의 차이

JAR :  Class 파일들이 묶인 jar 파일을 가져와서 그 안에 있는 서비스를 이용

더보기
쉽게 JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
실제로 JAR 파일은 플랫폼에 귀속되는 점만 제외하면 WIN ZIP파일과 동일한 구조
JDK(Java Development Kit)에 포함하고 있는 JRE(Java Runtime Environment)만 가지고도 실행이 가능합니다.

 

WAR : 포맷으로 묶어서 Tomcat 등의 웹 컨테이너(WAS) 에다 넣고 deploy 

더보기
servlet / jsp 컨테이너에 배치 할 수 있는 웹 어플리케이션(Web Application) 압축 파일 포맷입니다. 
JSP, SERVLET, JAR, CLASS, XML, HTML, JAVASCRIPT 등  웹 어플리케이션이 구동되기 위한
기타 자원을 한 군데에 모아 배포하는데 사용되는 파일입니다.
 
WAR는 웹 응용 프로그램를 위한 포맷이기 때문에 웹 관련 자원만 포함하고 있으며 
이를 사용하면 웹 어플리케이션을 쉽게 배포하고 테스트 할 수 있습니다.
 
원하는 구성을 할 수 있는 JAR 포맷과 달리
WAR은 WEB-INF 및 META-INF 디렉토리로 사전 정의 된 구조를 사용하며 
WAR파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹 서버 (WEB)또는 웹 컨테이너(WAS)가 필요합니다.
 
WAR 파일도 JAVA의 JAR 옵션( java - jar)을 이용해 생성하는 JAR파일의 일종으로
웹어플리케이션 전체를 패키징하기 위한 JAR파일로 생각하시면 될 것 같습니다.

★ 프로젝트 .Class 파일 위치 찾기


★ maven 생명주기

더보기

유효성 검사(validate)  → 컴파일(compile) → 단위 테스트  →  패키징(package)  → 검증(verity)  → 인스톨(install)  → 배포(deploy)


★ maven > .m2 > Repository 경로 변경


★ maven 로컬 repository 설정

Maven을 처음 설치했을 때,  Maven의 default local repository는 ${user.home}/.m2/repository/ 입니다.

${user.home} 은 windows의 경우 C:\Users\로그인사용자디렉토리\ 입니다.

 

Maven의 settings.xml 파일에 <localRepository> 태그를 사용하여

새로운 Local Repository를 설정 할 수 있습니다. ( 절대 경로 입력 )

더보기

<settings>
         <localRepository>C:\my_repo</localRepository>
</settings>


★ war  또는 jar 파일 생성하기

 1 . pom.xml  파일 정의

https://hahagogo.tistory.com/308

 

Pom.xml 총 정리

빌드 툴을 Maven으로 사용한다면 프로젝트 생성 시 pom.xml 파일이 생겨있을 것이다. POM은 "Project Object Model"의 약자로, 프로젝트의 다양한 정보를 처리하기 위한 객체 모델이다. pom.xml 파일에는 프로

hahagogo.tistory.com

 

2 . war 파일 또는 jar 파일 생성하기

방법1  : 프로젝트 우클릭 -> export 클릭 -> war 검색 후 선택 -> war파일 이름과 저장 경로 선택 -> 생성 완료

방법2  : 프로젝트 우클릭 ->   [ Run As ]-[ Maven Build.. ]  ->  생성 완료

방법3  : 프로젝트 우클릭 ->  [ Run As ]-[ Maven install ]  ->  생성 완료

 

오류가 없으면 콘솔창에 "BUILD SUCCESS" 메시지가 출력되며, 

 해당 프로젝트의 [target]폴더를 선택하고 F5버튼을 눌러 새로고침하면 war파일이 만들어진 것을 확인할 수 있습니다.

 

 

3 . 생성된 jar 파일을 다른 프로젝트에 추가

 

 

4 . Build 와 install 차이

Maven Build  :  프로젝트 폴더의 target 폴더에 파일이 jar 파일이 생성됩니다.

Maven install : 프로젝트 폴더의 target 폴더에도 jar 파일이 생성되고, 

로컬 Repository의 .m2 에도 artifact가 생성되어,

로컬의 다른 프로젝트에서 이 jar 파일을 pom.xml 에서 의존성을 추가하여 참조할수 있게 됩니다.

 

5 . Runnable JAR ( 실행가능한jar ) 배포

 - Jar 파일 : 의존성 추가로 다른 파일에서 참조 가능

- 실행가능한 Jar 파일 :  단독 실행 가능

- Window 에서 jar 파일 실행

  1. cmd 관리자 권한으로 실행

  2. cd 명령어를 통해  jar파일위치 이동

  3. java -jar jar파일명 입력

 

 

6. Maven Profile 이용한 배포 Config 파일 구성

https://hahagogo.tistory.com/325

 

[Maven] profile이용한 배포 환경별(local, dev, prod) 빌드 설정

1.환경별 리소스 폴더 구분메인 폴더 하위에 환경별 리소스 폴더를 만들고 각 환경에 맞는 설정 파일을 생성합니다.  개발자 서버 환경(local), 개발 서버 환경(dev),  운영 서버 환경(prod) 총 3

hahagogo.tistory.com


★ Tomcat 다루기

 

1. Tomcat Start

 Tomcat을 설치한 경로 > bin 하위에 있는 startup.bat (or startup.sh) 파일을 통해 실행할 수 있다.

 

2. Tomcat에 배포하기

[tomcat설치폴더]/webapps로 이동하면 이미 ROOT라는 폴더가 존재한다.

 

방법 1 : ROOT.war로 생성한 경우

  1. webapps 안에있는  war파일을 제거하고 배포하려는 war 파일을 ROOT.war로 이름을 변경한다.
  2. ROOT.war 파일을 webapps 폴더 내부로 이동시킨다.

tomcat은 별도의 설정이 없으면 자동으로 webapps내 ROOT폴더를 root로 실행한다. 따라서 ROOT라는 이름을 사용하게 되면 별도의 설정을 할 필요가 없다.


방법 2 : 다른이름으로 war을 생성한 경우 

  1. 1번 방법과 동일하게 webapps 폴더 내부에 war파일을 위치시킨다. 
  2. webapps를 빠져나와 tomcat설치폴더/conf/server.xml을 편집툴로 연다. 
  3. Host태그 내부에 <Context path="[경로]" docBase="[war파일의 이름]"  reloadable="false" > </Context>를 추가한다.  
    • 이 설정은 tomcat서버에서 하나의 가상경로를 추가하는 방법으로
    • path="/"로 설정하면 ROOT.war 대신 등록된 명칭의 war가 실행된다.
<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="/" docBase="war파일의 이름"  reloadable="false" > </Context>  
</Host>

 

방법 3 : Tomcat Manager 사용하기

  • 톰캣이 구동중이 아닌경우 톰캣 설치 경로에 가서 톰캣을 실행한다.
  • (기본설치 경로) C:\Program Files\Apache Software Foundation\Tomcat 9.0\bin
  •  Tomcat url:port번호/manager/html 로 접속이 가능하다.
    그러나, Tomcat Manager 페이지에 들어가려면 아래와 같이 로그인이 필요하기에, tomcat-users.xml 파일에서 계정을 설정해줘야 한다.
	<role rolename="manager-tomcat"/>
	<user username="test" password="test" roles="manager-tomcat"/>
  • 톰캣 서버 재시작 하고 로그인 ( localhost 에서 접근시 403  에러가 난다. )

 

 

 


★ web.xml

 

설정을 위한 설정파일입니다. 톰캣이 사용하는 메뉴얼 이라고 할 수 있습니다.

즉, 최초로 WAS가 최초로 구동될 때, 각종 설정을 정의해줍니다.

여러 xml파일을 인식하도록 각 파일을 가리켜 줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>

	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>


	<!-- 한글 변환 필터 시작 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 한글 변환 필터 끝 -->
    
    <error-page>
		<error-code>400</error-code>
		<location>/WEB-INF/jsp/error/errorPage.jsp</location>
	</error-page>
	<error-page>
		<error-code>401</error-code>
		<location>/WEB-INF/jsp/error/errorPage.jsp</location>
	</error-page>
    
    <jsp-config>
		<jsp-property-group>
			<url-pattern>*.jsp</url-pattern>
			<page-encoding>UTF-8</page-encoding>
			<include-prelude>/WEB-INF/jsp/layout/bbBase.jsp</include-prelude>
		</jsp-property-group>
	</jsp-config>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>welcome.jsp</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
    
	<!-- 웹 취약점 점검 HTTP verb 변조를 사용하는 인증 무시 조치 START -->
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>Forbidden</web-resource-name>
			<url-pattern>/*</url-pattern>
			<http-method>PUT</http-method>
			<http-method>DELETE</http-method>
			<http-method>TRACE</http-method>
			<http-method>PATCH</http-method>
			<http-method>OPTIONS</http-method>
		</web-resource-collection>
		<auth-constraint />
	</security-constraint>
	<!-- END -->
    
</web-app>

 

 

ServletContext   : <context-param>  어느 서블릿 객체에서든 접근 가능한 root-context

ServletContext sc = this.getServletContext();
String location = sc.getInitParameter("contextConfig");
더보기
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/context-*.xml</param-value>
</context-param>

 

ServletConfig   : <servlet>  특정 서블릿 객체에서만 접근 가능 servlet-context.xml

ServletConfig config = this.getServletConfig();
String title = config.getInitParameter("title");
더보기
<servlet>
	<servlet-name>bb-dispatcher</servlet-name>
	<servlet-class>
    	      org.springframework.web.servlet.DispatcherServlet
	</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:/spring/dispatcher-servlet.xml
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
	<multipart-config>
		<max-file-size>2071174526</max-file-size>
		<max-request-size>2071174526</max-request-size>
		<file-size-threshold>0</file-size-threshold>
	</multipart-config>
</servlet>
<servlet-mapping>
	<servlet-name>bb-dispatcher</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>


############# 작성방법 #############
<servlet>
   <servlet-name>{서블릿이름}</servlet-name>
   <servlet-class>{서블릿이름에 해당하는 클래스}</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>{서블릿이름}</servlet-name>
   <url-pattern>{클라이언트가 요청할 url패턴}</url-pattern>
</servlet-mapping>

url-pattern의 설정법
> 이름까지 정확히 일치 :  /[경로]/이름
> 디렉토리까지 일치    :   /[경로]/*
> 확장자만 일치        :  *.확장자

 

 

ServletContext  / ServletConfig  예시

 

 

서블릿 생명 주기

더보기

1) init()

서블릿을 처음 메모리에 올릴때 실행되어, 서블릿을 초기화하며 처음에 한번만 실행됩니다. 

 

2) service()

요청/응답(request/response)을 처리하며 요청이 GET인지 POST인지 구분하여 doGet() 또는 doPost() 메소드로 분기됩니다. 

 

3) destroy()

서블릿 종료요청이 있을때 destroy() 메소드가 실행됩니다. 

 

 

리스너 :: 어떠한 이벤트가 발생하면 호출되어 처리하는 객체로 인터페이스만 제공되므로 클래스는 직접 구현해야 한다.

더보기
<listener>
    <listener-class>com.bbtest.framework.listener.QuartzListener</listener-class>
    <!-- <listener-class>구현된 클래스 경로</listener-class> -->
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 

리스너 구현

https://hahagogo.tistory.com/313

 

Listener

1. ServletContextListener 웹 컨테이너는 웹 어플리케이션(컨텍스트)이 시작·종료되는 시점에 특정 클래스의 메서드를 실행할 수 있는 기능을 제공함 - 이 기능을 통해 웹 어플리케이션 실행시 필요한

hahagogo.tistory.com

 

 

session-config : 30분설정

더보기
<session-config>
    <session-timeout>30</session-timeout>
    <tracking-mode>COOKIE</tracking-mode>
</session-config>

 

mime type 매핑 :: 특정파일을 다운로드 시켰을때 다운로드창이 아닌 파일이 깨져보일때 정상적인 다운로드를 위해 설정

더보기
<mime-mapping>
   <extension>xls</extension>
   <mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>

 

Welcome File list :: 도메인으로만 접근하였을때 최초로 보여질 페이지를 지정

더보기
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>welcome.jsp</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

 

Error Pages 처리 :: error 발생시 안내 페이지를 지정

더보기
<error-page>
    <error-code>400</error-code>
    <location>/WEB-INF/jsp/error/errorPage.jsp</location>
</error-page>
<error-page>
    <error-code>401</error-code>
    <location>/WEB-INF/jsp/error/errorPage.jsp</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/WEB-INF/jsp/error/errorPage.jsp</location>
</error-page>

 

Filter  :: HTTP요청과 응답을 변경할 수 있는 재사용가능한 코드로 사용자와 서블릿 사이에 위치하여 request & response값을 알맞게 변경 할 수있게 한다.

더보기
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>multipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter
    </filter-class>
    <init-param>
        <param-name>multipartResolverBeanName</param-name>
        <param-value>multipartResolver</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    <url-pattern>*.json</url-pattern>
</filter-mapping>

 


root-context.xml , servlet-context.xml

 

스프링에서 말하는 컨텍스트(context) 스프링이 관리하는 빈들이 담겨 있는 컨테이너라고 생각하시면 됩니다

스프링 프로젝트를 생성하면 web.xml이라는 파일이 있습니다.

<context-param> 태그 안에 있는 설정이 root-context 관련한 것들이고

<servelet> 태그 안에 있는 설정이 servlet-context 관련 설정입니다.

 

  1. <context-param>을 이용하여 root-context 설정(action-mybatis가 root-context)
  2. <listener>태그의 ContextLoaderListener 클래스를 이용하여 root-context들을 불러옴
  3. 클라이언트의 요청을 받으면 <servlet> 태그 안에 있는 설정들이 작동하면서 servlet-context를 불러옴과 동시에 root-context와 같이 불러옵니다. 이때 DispatcherServlet 클래스를 실행합니다.

ㅣ root-context   ::  <context-param></context-param>

root-context.xml 

더보기

1. root-context에 등록되는 빈들은 모든 컨텍스트에서 사용할 수 있습니다. (공유 가능)
2. service나 dao를 포함한, 웹 환경에 독립적인 빈들을 담아둡니다.
3. 서로 다른 servlet-context에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있습니다.
4. servlet-context 내 빈들은 이용이 불가능합니다.

 

servlet-context.xml 과는 반대로 view와 관련되지 않은 객체를 정의합니다.

따라서 Service, Repository(DAO), DB등 비즈니스 로직과 관련된 설정을 해줍니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
		<property name="url" value="jdbc:mysql://localhost:3306/springbasic?useUnicode=true&amp;characterEncoding=utf8"></property>
		<property name="username" value="back"></property>
		<property name="password" value="rhrlekd1+"></property>
	</bean>

	<!-- Mysql <-> Mybatis를 연결해주는 객체 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation"  value="classpath:META-INF/mybatis-configs.xml"/>
		<property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"/>
	</bean>

	<!-- sql session Factory :: DB 사용이 끝나면 close > -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache" >
		<constructor-arg name ="sqlSessionFactory" ref="sqlSessionFactory"/>
	</bean>

	<!-- dataSource를 setter로 지정[ DataSourceTransactionManager ] -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

	<!-- @Transactional 사용하기 위해 -->
	<tx:annotation-driven/>

	<!-- Component Package 지정 :: com ( component-scan ) -->
	<!-- 패키지 안에 있는 클래스 중에서 @Component 붙은것을 찾아서 Bean 으로 등록 -->
	<context:component-scan base-package="com.test.ch4"/>

</beans>

 

ㅣ servlet-context  ::  <servlet></servlet> 

servlet-context.xml

더보기

1. servlet-context에 등록되는 빈들은 해당 컨테스트에서만 사용할 수 있습니다.
2. DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는 데 사용합니다.
3. 독자적인 컨텍스트들을 가지며, root-context 내 빈 사용이 가능합니다.

 

url과 관련된 controller나, @(어노테이션), ViewResolver, Interceptor, MultipartResolver 등의 설정을 해줍니다. 

또한 DispatcherServlet과 관련된 설정을 합니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
			 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			 xmlns:beans="http://www.springframework.org/schema/beans"
			 xmlns:context="http://www.springframework.org/schema/context"
			 xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

	<!-- Component Package 지정 -->
	<context:component-scan base-package="com.test.ch4"/>

	<!-- root 접속시 index.jsp -->
	<view-controller path="/" view-name="index"/>

</beans:beans>

1. @Component
역할: 스프링이 관리해야 할 일반적인 빈을 정의할 때 사용합니다.
설명: 특별한 역할이 없는 단순한 빈으로, 주로 재사용 가능한 범용 컴포넌트에 사용합니다. 
      예를 들어 유틸리티 클래스나 헬퍼 클래스처럼 특정 계층에 속하지 않는 경우 사용합니다.
용도: @Component는 가장 일반적인 애너테이션으로, 특별한 의미 없이 빈으로 관리하고 싶을 때 
      사용할 수 있습니다.


2. @Service
역할: 비즈니스 로직을 수행하는 서비스 계층을 나타냅니다.
설명: 비즈니스 로직을 처리하는 클래스에 사용하며, 주로 트랜잭션 관리와 같은 비즈니스 관련 
      기능이 포함됩니다.
용도: 주로 비즈니스 로직을 포함하는 서비스 클래스에 사용하여, 코드의 가독성을 높이고 
      역할을 명확히 합니다.


3. @Repository
역할: 데이터 접근 계층(DAO)을 나타내며, 데이터베이스와의 상호작용을 담당합니다.
설명: 데이터베이스 쿼리와 관련된 예외를 스프링의 데이터 접근 예외로 변환해주는 기능을 포함하고 
      있습니다.
용도: 데이터베이스에 직접 접근하여 데이터를 저장, 수정, 삭제, 조회하는 클래스에 사용합니다. 
      주로 JPA, JDBC 등을 통해 데이터베이스를 조작할 때 사용합니다.


4. @Controller
역할: 웹 요청을 처리하고, 뷰와 데이터를 반환하는 컨트롤러 계층을 나타냅니다.
설명: 웹 애플리케이션의 프레젠테이션 계층을 담당하며, 사용자의 요청을 받고 처리한 후 
      결과를 반환합니다.
용도: 웹 요청(URL 요청)을 받아서 적절한 서비스를 호출하고, 결과를 반환하는 클래스에 사용합니다. 주로 @RequestMapping과 함께 사용하여 특정 URL 패턴에 매핑됩니다.

ㅣ Naming 서비스

Java Naming and Directory Interface(JNDI)는

Java 소프트웨어 클라이언트가 이름(name)을 이용하여 데이터 및 객체를 찾을 수 있도록

도와주는 디렉토리 서비스에 대한 Java API이다.

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:itl:naming_service

 

egovframework:rte:itl:naming_service [eGovFrame]

Naming 서비스는 Java Naming and Directory Interface(JNDI) API를 이용하여 자원(Resource)를 찾을 수 있도록 도와주는 서비스이다.Naming 서비스를 지원하는 Naming 서버에 자원을 등록하여 다른 어플리케이션에서

www.egovframe.go.kr

 


핸들러 매핑(HandlerMapping)과 핸들러 어댑터(HandlerAdapter)

Spring MVC 구조에서는 DispatcherServlet이  클라이언트의 요청을 받아 해당 요청을 처리하는 핸들러를 호출한다. 

그런 후 요청을 처리한 핸들러로부터 받은 결과로 뷰를 렌더링한다.

뷰를 렌더링하기 전에 뷰 리졸버를 통해서 원하는 뷰를 찾아야 하는데,

그렇게 하기 위해서 핸들러는 ModelAndView 타입을 반환해야 한다.

즉, DispatcherServlet은 ModelAndView타입을 핸들러로부터 받아야 한다.

 

핸들러 매핑을 통해서 클라이언트 요청에 상응하는 핸들러를 찾아야 한다.

하지만 핸들러에 따라서 찾는 방법이 달라질 수 있다.

 

예를 들어 @RequestMapping을 통해 컨트롤러(헨들러)를 등록했다면 RequestMappingHandlerMapping 방식으로 찾을 수 있고, 스프링 빈 이름을 요청 URL로 등록했다면 BeanNameUrlHandlerMapping방식으로 찾아야 한다.  그 밖에도 다른 방법들이 있으며 spring에 등록된 우선순위에 따라 HandlerMapping을 핸들러를 찾을 때까지 순서대로 실행한다. 


Sast 와 Dast 란?

Sast :   소스코드를 검토하여 취약점을  분석하는 방법

Dast : 웹 취약점 분석

 

취약점 분석 도구https://sparrowfasoo.com/kr/product/dast/

 

스패로우 - 제품 - DAST 웹 취약점 분석

웹 애플리케이션 취약점 동적 분석 도구 (HTML5, Ajax 등 기술 지원, 취약점 공격 과정 이벤트 별 재현, 오픈소스 라이브러리 분석 등)

sparrowfasoo.com

ㅣ이클립스 취약점 점검도구

1. PMD : 시큐어 코딩을 위해 자바 코드를 검사해서 나쁜 코딩을 잡아준다.

   - PMD Rule 

egovinspectionrules-3.8.zip
0.02MB

 

2. findbugs

findsecbugs-plugin-1.12.0.jar
0.44MB


BeanUtils.copyProperties

https://hahagogo.tistory.com/316

 

BeanUtils.copyProperties

Spring을 사용하다가, 은근히 종종 Class간 property를 복사해야 할 경우가 있다. DB에서 조회한 Person1과 Person2가 있는데, 이 property를 서로 복사하거나 하는 작업을 해야할 때가 있다. 그럴때마다 원시

hahagogo.tistory.com


ㅣ Spring AOP

https://hahagogo.tistory.com/167

 

AOP

AOP 란? 관점 지향 프로그래밍 공통된 코드를 하나로 관리하기 위함 메서드의 시작 또는 끝에 동적(실행중인 상태)으로 추가되게 하는것. 0. 기존에 분리되지 않은 코드 class MyClass{ void aaa(){ System.o

hahagogo.tistory.com


ㅣ Spring DI

https://hahagogo.tistory.com/160

 

Spring DI 이론

메타 애너테이션 : 애너테이션@ 을 만들때 사용하는 애너테이션 Bean : spring contain가 관리하는 객체 Spring container : 빈의 저장소, 빈을 저장 관리 1. Bean Factory : 빈을 생성 연결 등의 기본 기능을 정

hahagogo.tistory.com

https://hahagogo.tistory.com/159

 

Spring DI 사용하기

https://hahagogo.tistory.com/157 Spring DI 1. 다형성 Car car = (Car) getObject("car"); Engine engine = (Engine) getObject("engine"); static Object getObject(String key) throws Exception { Properties p = new Properties(); p.load( new FileRead.. hahagogo.

hahagogo.tistory.com

https://hahagogo.tistory.com/157

 

Spring DI 흉내내기

1. 다형성 Car car = (Car) getObject("car"); Engine engine = (Engine) getObject("engine"); static Object getObject(String key) throws Exception { Properties p = new Properties(); p.load( new FileReader("config.txt") ); Class clazz = Class.forName( p.getP

hahagogo.tistory.com


ㅣ ImageAttachServlet ::  webapps 외부 폴더 이미지 불러오기

https://hahagogo.tistory.com/319

 

ImageAttachServlet

web.xml previewImg com.jiransnc.framework.utils.ImageAttachServlet 1 previewImg /prevImage/img/* ImageAttachServlet.java 더보기 @WebServlet("/prevImage/img/*") public class ImageAttachServlet extends HttpServlet { private static final long serialVersion

hahagogo.tistory.com


DBCP성능관점, 역활 및 관리

더보기
maxActive >= initialSize
최대 커넥션 개수는 초기에 생성할 커넥션 개수와 같거나 크게 설정해야 한다.
 
maxActive = maxIdle
maxActive 값과 maxIdle 값은 같은 것이 바람직하다. 만약 둘의 값이 아래와 같다고 가정해보자.
 
maxActive = 10
maxIdle = 5
항상 커넥션을 동시에 5개는 사용하고 있는 상황에서 1개의 커넥션이 추가로 요청된다면 maxActive = 10이므로 1개의 추가 커넥션을 데이터베이스에 연결한 후 Pool은 비즈니스 로직으로 커넥션을 전달한다. 이후 비즈니스 로직이 커넥션을 사용 후 풀에 반납할 경우, maxIdle = 5에 영향을 받아 커넥션을 실제로 닫아버리므로, 일부 커넥션을 매번 생성했다 닫는 비용이 발생할 수 있다.
 
initialSize와 maxActive, maxIdle, minIdle 항목을 동일한 값으로 통일해도 무방하다.
커넥션 개수와 관련된 가장 중요한 성능 요소는 일반적으로 커넥션의 최대 개수다. 4개 항목의 설정 값 차이는 성능을 좌우하는 중요 변수는 아니다.
 
maxActive 값은 DBMS의 설정과 애플리케이션 서버의 개수, Apache, Tomcat에서 동시에 처리할 수 있는 사용자 수 등을 고려해서 설정해야 한다. DBMS가 수용할 수 있는 커넥션 개수를 확인한 후에 애플리케이션 서버 인스턴스 1개가 사용하기에 적절한 개수를 설정한다. 사용자가 몰려서 커넥션을 많이 사용할 때는 maxActive 값이 충분히 크지 않다면 병목 지점이 될 수 있다. 반대로 사용자가 적어서 사용 중인 커넥션이 많지 않은 시스템에서는 maxActive 값을 지나치게 작게 설정하지 않는 한 성능에 큰 영향이 없다.
 
Commons DBCP에서는 DBMS에 로그인을 시도하고 있는 커넥션도 사용 중인 것으로 간주한다. 만약 DBMS에 로그인을 시도하고 있는 상태에서 무한으로 대기하고 있다면, 애플리케이션에서 모든 커넥션이 사용 중인 상태가 돼 새로운 요청을 처리하지 못할 수도 있다. 이런 경우 장애 확산을 최소화하려면 Microsoft SQL Server의 JDBC 드라이버에서 설정하는 loginTimeOut 속성같은 JDBC 드라이버별 타임아웃 속성을 설정하는 것이 좋다.
 
WAS의 Thread 수와 Connection Pool 수의 관계
WAS에서 설정해야 하는 값이 굉장히 많지만, 그 중 가장 성능에 많은 영향을 주는 부분은 Thread와 Connection Pool의 개수 이다.
 
이들 값은 직접적으로 메모리와 관련이 있기 때문에, 많이 사용하면 할 수록 메모리를 많이 점유하게 된다. 그렇다고 반대로 메모리를 위해 적게 지정한다면, 서버에서는 많은 요청을 처리하지 못하고 대기 할 수 밖에 없다.
 
DB Connection Pool 관리 어떻게 하면 좋을까?
가장 좋은 방법은 애플리케이션을 실제 운영할 시스템 환경에서 성능 테스트를 진행하는 것이다. 성능 테스트를 진행하면서 지금까지 살펴본 DBCP에 대한 원리와 설정을 위한 값들을 복기하면서 시스템 환경에 최적화된 값을 찾아 내는 것이 좋겠다.
 
실제 운영중인 서비스에서 DBCP 값이 200에 가까운 수치가 설정되어 있어, 문제가 발생된 경우를 보았다. 무엇보다, WAS Thread 수는 DB Connection Pool의 갯수보다 더 적게 설정 되어 있었는데, 이러한 점을 효율적이지 못하다.
 
그렇다면, WAS의 Thread의 개수가 DB의 Connection Pool의 갯수 보다 많아야 하는 이유는 무엇일까? 그 이유는 애플리케이션에 대한 모든 요청이 DB에 접근하는 것은 아니기 때문이다.
 
WAS의 Thread는 Connection Pool의 갯수보다 여유있게 설정하는 것이 좋다.
 
Connection Pool은 시스템의 환경에 따라 다르지만 보통 40~50개로 지정하면 Thread는 이보다 10개 정도 더 지정하는 것이 바람직하다. 하지만 최적의 성능의 위해서는 실제 요청이 얼마나 들어오는지 파악하는게 중요하며 가장 좋은 방법은 앞서 말한것 처럼 성능 테스트를 통해 최적화된 값을 구하는 것이다.

https://velog.io/@won4932/DBCP%EC%84%B1%EB%8A%A5%EA%B4%80%EC%A0%90-%EC%97%AD%ED%99%9C-%EB%B0%8F-%EA%B4%80%EB%A6%AC

 

velog

 

velog.io


ㅣ jndi 

  • 데이터베이스 커넥션을 자바 웹 애플리케이션이 아닌 WAS에서 데이터베이스 커넥션을 생성하고 풀로 관리하기 위함
  • WAS 의 설정파일 안에 JNDI 를 입력해놓으면 웹 애플리케이션은 JNDI 만 호출하면 DB 접속이 가능하다.

https://seul96.tistory.com/249

 

[MYSQL] JNDI 설정

솔루션에서 DB를 연결할 때는 솔루션.properties를 이용하여 DB에 직접 연결하는 방법과 WAS를 통해서 JNDI로 연결하는 2가지 방법이 있다. 여기서는 WAS를 통해서 JNDI로 연결하는 방법을 하려고 한다.

seul96.tistory.com


ㅣSSO 연동

 

1. xml 이용한 방법

https://hahagogo.tistory.com/317

 

2. Controller 에서 sendRedirect 하는 방식

https://hahagogo.tistory.com/318


ㅣ SSL 인증서 적용

https://hahagogo.tistory.com/320

 

ssl 인증서

* Well Known 포트 : 0부터 1023 * Registered 포트 : 1024부터 49151 * Dynamic/Private 포트 : 49152부터 65535 1024 이하의 포트 번호에 붙으려고 하면 포트 포워딩이 필요하다. 따라서 톰캣(8443) > 서버 > 443 으로 포트

hahagogo.tistory.com


ㅣ게시판 댓글

https://hahagogo.tistory.com/140

 

spring 게시판 댓글기능

먼저 테이블을 만든다.. CREATE TABLE `board` ( `idx` INT NOT NULL AUTO_INCREMENT, `writer` VARCHAR(50) NOT NULL COMMENT '작성자' COLLATE 'utf8_general_ci', `writer_id` VARCHAR(50) NOT NULL COMMENT '작성자' COLLATE 'utf8_general_ci', `title` V

hahagogo.tistory.com


ㅣ 페이징

https://hahagogo.tistory.com/109

 

spring 페이징, SQL_CALC_FOUND_ROWS

페이징을 하기 전에 부트스트랩의 pagination 을 들어가서 css 를 적용한다. https://getbootstrap.kr/docs/5.1/components/pagination/#%ED%81%AC%EA%B8%B0-%EC%A1%B0%EC%A0%88 페이지네이션 여러 페이지에 일련의 관련 내용이

hahagogo.tistory.com


ㅣ Server.xml

 이미지 불러오기 path 잡을때 Context 를 하나 더 추가

 

<Host name="localhost" appBase="/miso_dev" unpackWARs="true" autoDeploy="true">
     <Context path="/" docBase="webapps" reloadable="true" /> 이 부분을 찾아서 밑에

     <Context docBase="D:\fileUpload" path="/editorImage" reloadable="true"/> 을 추가하고

      D:\fileUpload\1111.jpg 파일을 예시로 이미지 접근이 되는지 확인합니다.


 

728x90

+ Recent posts