★ JAR 과 WAR의 차이
JAR : Class 파일들이 묶인 jar 파일을 가져와서 그 안에 있는 서비스를 이용
WAR : 포맷으로 묶어서 Tomcat 등의 웹 컨테이너(WAS) 에다 넣고 deploy
★ 프로젝트 .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로 생성한 경우
- webapps 안에있는 war파일을 제거하고 배포하려는 war 파일을 ROOT.war로 이름을 변경한다.
- ROOT.war 파일을 webapps 폴더 내부로 이동시킨다.
tomcat은 별도의 설정이 없으면 자동으로 webapps내 ROOT폴더를 root로 실행한다. 따라서 ROOT라는 이름을 사용하게 되면 별도의 설정을 할 필요가 없다.
방법 2 : 다른이름으로 war을 생성한 경우
- 1번 방법과 동일하게 webapps 폴더 내부에 war파일을 위치시킨다.
- webapps를 빠져나와 tomcat설치폴더/conf/server.xml을 편집툴로 연다.
- 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 관련 설정입니다.
- <context-param>을 이용하여 root-context 설정(action-mybatis가 root-context)
- <listener>태그의 ContextLoaderListener 클래스를 이용하여 root-context들을 불러옴
- 클라이언트의 요청을 받으면 <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&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
2. findbugs
ㅣ 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성능관점, 역활 및 관리
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 파일을 예시로 이미지 접근이 되는지 확인합니다.