728x90
반응형

web.xml은 웹 애플리케이션의 전역 설정 파일


• DispatcherServlet 등록 → 스프링 MVC 구동
• ContextLoaderListener 등록 → Root ApplicationContext 구동
• 필터/리스너 등록 → 인코딩, 보안, 로깅 등 공통 처리
• 서블릿 매핑 → URL과 서블릿 연결


1. 웹 애플리케이션의 시작점 설정

• 웹 애플리케이션이 Tomcat 같은 서블릿 컨테이너에 배포될 때 가장 먼저 읽히는 설정 파일
• 어떤 Servlet, Filter, Listener를 사용할지 정의

2. DispatcherServlet 등록

웹 계층 담당
• Spring MVC의 핵심인 DispatcherServlet(Front Controller)을 등록하는 곳

<!—- 모든 요청이 DispatcherServlet으로 들어가도록 연결—->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-name>/WEB-INF/…/dispatcher-servlet.xml</param-name>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>


3. ContextLoaderListener 등록

• Root ApplicationContext를 띄워주는 역할
비즈니스 로직 및 인프라 계층 담당(보통 서비스, DAO, DataSource 같은 Bean들은 여기서 초기화)

1. ContextLoaderListener + DispatcherServlet (정석 구조)
• Root Context (ContextLoaderListener)
• DataSource, TransactionManager, DAO, Service
• Web Context (DispatcherServlet)
• Controller, ViewResolver

2. DispatcherServlet만 사용하는 경우
• DispatcherServlet이 로딩하면서 DB 설정(iBatis Config)까지 다 들고감
• Root Context 없이 Web Context 하나로 통합 운영
• 초기 스프링/레거시 프로젝트에서 자주 보이는 방식

4. 필터(Filter) 설정

• 인코딩, 보안, 로깅 같은 기능을 전역으로 걸 수 있음

5. 서블릿 매핑

• 특정 URL 패턴을 어떤 서블릿이 처리할지 정의


728x90
반응형
728x90
반응형

✅ Spring

  • 자바 기반 애플리케이션 개발을 쉽게 해주는 프레임워크
  • 핵심은 DI(의존성 주입), AOP(관점 지향 프로그래밍) 같은 기능으로 객체 관리와 비즈니스 로직을 깔끔하게 분리할 수 있게 도움
  • 모듈형 구조라서, 프로젝트에서 필요한 기능에 따라 의존성을 선택적으로 추가하면 됨


✅ Modules

  • Core: 스프링의 기본 동작(빈 관리, DI, 표현식, 컨텍스트)
  • Web: 웹 애플리케이션 개발 지원
  • AOP: 부가 기능을 분리해주는 도구
  • Security:로그인/권한/보안 관리(인증/인가 처리)


https://docs.spring.io/spring-framework/docs/4.0.x/spring-framework-reference/html/overview.html

2. Introduction to Spring Framework

Spring Framework is a Java platform that provides comprehensive infrastructure support for developing Java applications. Spring handles the infrastructure so you can focus on your application. Spring enables you to build applications from "plain old Java o

docs.spring.io



✅ 모듈 의존성 순서도

spring-core
   ↓
spring-beans
   ↓
spring-context
   ↓
spring-expression
   ↓
spring-aop
   ↓
spring-web
   ↓
spring-webmvc
   ↓
spring-security-core
   ↓
spring-security-web
   ↓
spring-security-config
   ↓
spring-security-taglibs


✅ 주요 Spring Core 모듈


1. spring-core
• 스프링의 가장 기본이 되는 모듈
• IoC(Inversion of Control), DI(Dependency Injection)를 제공
• BeanFactory 같은 핵심 컨테이너 기능이 포함

2. spring-beans
• Bean(객체) 정의, 생성, 주입을 담당
• XML, annotation, Java config 등 다양한 설정 방식 지원

3. spring-context
• spring-core, spring-beans 위에 올라가는 모듈
• ApplicationContext를 제공 → 메시지 리소스 처리, 이벤트 발행, 국제화(i18n) 지원

4. spring-expression(SpEL, Spring Expression Language)
• #{} 같은 표현식으로 객체 그래프를 조회·조작할 수 있게 해주는 언어
• 예: @Value("#{systemProperties['java.home']}")


✅ Spring Web 관련 모듈


1. spring-web
• Servlet API 위에서 동작
• 멀티파트 파일 업로드, 웹 관련 유틸, REST 지원 등

2. spring-webmvc
• 흔히 말하는 Spring MVC
• DispatcherServlet 기반으로 Model-View-Controller 패턴 지원
• REST API, 뷰 렌더링, 핸들러 매핑/어댑터, 컨트롤러 관리 등


✅ Spring AOP


• AOP(Aspect-Oriented Programming) 지원 모듈
• 로깅, 트랜잭션, 보안 같은 **횡단 관심사(Cross-cutting concerns)**를 분리
• 예: 모든 서비스 메서드 실행 전에 로깅 실행


✅ Spring Security 관련 모듈


1. spring-security-core
• 인증(Authentication), 인가(Authorization)의 핵심 로직
• 사용자 계정, 권한(Role) 관리

2. spring-security-web
• 보안을 웹 레벨(필터 기반)에서 적용
• 로그인/로그아웃, 세션 관리, CSRF 보호, URL 기반 접근 제어

3. spring-security-config
• XML, Java Config로 보안 설정을 쉽게 할 수 있게 해주는 모듈
• 예: @EnableWebSecurity

4. spring-security-taglibs
• JSP 같은 뷰에서 보안 태그 사용 가능.
• 예: <sec:authorize access="hasRole('ADMIN')">


Spring Boot일 경우‼️

대부분의 모듈을 직접 추가하지 않고, starter 의존성으로 해결

Ex)
spring-boot-starter-web
→ spring-web, spring-webmvc, spring-core 등 자동 포함
spring-boot-starter-security
→ spring-security-* 모듈 자동 포함

즉, Boot 사용 시에는 목적별 스타터만 추가하면 끝이고,
Legacy Spring 사용 시에는 개별 모듈을 직접 추가해야 함(pom.xml)


1. 소프트웨어에서 “레거시”의 일반 개념
• 레거시 시스템/프로젝트 = 오래된 기술, 아키텍처, 코드 스타일을 기반으로 돌아가는 시스템
• 당장은 동작하지만 유지보수나 확장이 어렵고, 최신 기술 스택과는 괴리가 있는 경우가 많음

2. 스프링 맥락에서 “레거시 프로젝트”
• 스프링에서 말하는 레거시 프로젝트는 보통 Spring Boot를 쓰지 않고, 직접 XML 또는 JavaConfig로 설정한 프로젝트 뜻함

• Maven/Gradle에서 필요한 모듈을 하나씩 직접 추가해야 함(spring-core, spring-beans, spring-webmvc 등)

• 환경 설정(XML, JavaConfig)을 직접 관리
-applicationContext.xml
-web.xml + dispatcher-servlet.xml

• 서버도 내장 Tomcat이 아니라, WAR 파일 빌드 후 외부 WAS(WebSphere, Tomcat 등)에 배포

• 프로젝트 구조가 복잡하고 설정 코드 양이 많음


728x90
반응형
728x90
반응형

 

 
스프링부트 테스트 코드를 실행했는데 에러가 발생했다
 
Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found ...
해당 생성자의 파라미터에는 단일 bean이 필요한데 2개가 발견됐다
- AppConfig의 memberRepository

-MemoryMemberRepository의 memoryMemberRepository
 
 
에러 내용을 더 확인해보자

  1. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [~\classes\hello\core\member\MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository
  2. Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository


세번째 같은 말을 하고 있다
 
 
 
 
확인 결과, 같은 타입인데 이름이 다른 두개의 빈이 있었다
두둥탁

 
수동 빈 생성
 

 
자동 빈 생성
 
 
 
그래서 나는 @Primary로 조회할 빈에 우선순위를 부여해줬다

 

728x90
반응형
728x90
반응형



log4j2 라이브러리 추가 후
출력되는 로그들 중 sql 로그의 경우 쿼리와 파라미터 값이 따로 출력된다.

Executing Statement: SELECT * FROM emp WHERE age > ? AND name LIKE ‘%’|| ? || ‘%’
Parameters: [28, k]

대충 이런 느낌으로..

그래서 디버깅 시 해당 쿼리를 따로 실행하려고 하면 굉장히 불편하다.
이럴 때는 log4jdbc 라이브러리를 사용하면 현재 실행되는 쿼리의 파라미터까지 한번에 로그로 출력할 수 있다.


설정


1. log4jdbc.log4j2.properties 추가

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

log4j2.xml 설정 파일이 위치한 경로에 추가



2. log4jdbc-log4j2-jdbc4-1.16.jar 라이브러리 추가
아니면 pom.xml에 추가하던가..



3. context-datasource.xml 수정
변경 전

<property name=“driverClassName” value=“oracle.jdbc.driver.OracleDriver”>

변경 후

<property name=“driverClassName” value=“net.sf.log4jdbc.sql.jdbcapi.DriverSpy”>




4. globals.properties 수정
변경 전

Globals.Url=jdbc:oracle:thin:@…

변경 후

Globals.Url=jdbc:log4jdbc:oracle:thin:@…



728x90
반응형
728x90
반응형

✅ Logging

  • 시스템이 동작할 때 시스템의 상태 및 동작 정보를 시간 경과에 따라 기록하는 것을 의미
  • 개발 과정 혹은 개발 후에 발생하는 동작에 대해 트래킹을 하여 예기치 못한 이슈를 진단 및 해결하는데 도움이 되지만 무분별한 로깅은 성능상 이슈를 발생시킬 수 있기 때문에 의미 있는 정보를 적절한 수준으로 수집하는 것이 중요
  • Java는 System.out.println()을 이용하거나 Logging Framework를 사용하여 로그를 남길 수 있음
System.out.println();
- Java를 처음 접할 때부터 사용할 수 있는 간단한 로깅 방법
- 가장 편하고 확인하기 좋은 방법이지만 성능에 영향을 많이 주는 경우가 빈번히 발생
- 파일이나 콘솔에 로그를 남길 경우 내용이 완전히 프린트되거나 저장될 때까지 다른 작업들이 대기할 수 밖에 없음→애플리케이션에서는 대기시간 발생(이 대기시간은 시스템 속도에 의존적)
- locale의 영향으로 실제 결과와 콘솔에 출력되는 결과가 다를 수 있음
Logging Framework
Java에서는 성능과 편리함을 잡은 다양한 Logging Framework가 있으며 이를 통해 쉽게 로깅을 처리할 수 있음

 
 
 

 Logging Framework 종류

 

*jul(java.util.logging) → Log4j → Logback → Log4j2 순으로 등장
 

종류 설명
jul(java.util.logging) - Java 1.4 버전부터 내장되어있는 내장 로깅 프레임워크
Slf4j
(Simple Logging Facade for Java)
- 퍼사드패턴을 적용한 로깅 추상화 프레임워크(interface)
- 래퍼 라이브러리로 설정에 따라서 실제 구현체(implement)인 'Log4j2', 'Logback'을 사용할 수 있음(but 하나만 사용 가능하며 두개 이상 사용할 경우 에러 발생)
- interface이므로 단독 사용 불가
Apache Log4j
(Logging for Java)
- Apache의 Java 기반 로깅 프레임워크 
Logback - Log4를 만든 개발자가 Log4j기반으로 더 빠른 속도와 더 적은 메모리 점유율 등 성능을 개발하여 만든 로깅 프레임워크
Apache Log4j2
(Logging for Java 2)
- Log4j와 java.util.logging(jul)을 포함한 기존의 로깅 솔루션을 기반으로 만들어진 로깅 프레임워크

 

퍼사드 패턴(Facade Fattern)


- 여러 라이브러리, 프레임워크 또는 클래스들의 복잡한 집합을 단순화시켜주는 인터페이스를 제공하는 구조의 디자인 패턴
- 퍼사드 패턴 적용 장점 예: log4j2 보안 이슈가 발생하면 자바 코드 수정 없이 설정 파일만 추가해서 logback으로 이전 가능
 
 
 


✅ log4j2 설정

 
 
 
 
 
 
 
 
 
로그 레벨
TRACE > DEBUG > INFO > WARN > ERROR > FATAL > OFF
 
 
 
 
 
 
 
 

https://dev-donghwan.tistory.com/128
https://kanoos-stu.tistory.com/76
https://www.atatus.com/blog/best-practices-in-java-logging/

728x90
반응형

+ Recent posts