본문 바로가기
BackEnd

6/1 - 의존성 주입 (DI), 관점 지향 프로그래밍 (AOP)

by Jiwon_Loopy 2025. 6. 6.
반응형

목차


DI


  • setter 주입
  • 생성자 주입
  • xml 형태의 bean 주입 방식
<beans>
	<bean id="memberService" class="com.spring.ex03.MemberService">
		<property name="memberDAO" ref="memberDAO" />
	</bean>

	<bean id="memberDAO" class="com.spring.ex03.MemberDAOImpl">
</beans>

관점 지향 프로그래밍 (AOP)


  • 공통의 기능을 구현해 주는 것
  • 사용자 접속 내역 로그, 트랜잭션, 예외 처리, 이메일 통보 등 모든 웹 애플리케이션에서 공통으로 사용하는 기능
  • AOP는 메서드 안의 주기능과 보조 기능을 분리한 후 선택적으로 메서드에 적용해서 사용
  • 관련 용어
    • aspect
      • 구현하고자 하는 보조 기능
    • advice
      • aspect의 실제 구현체, 메서드 호출을 기준으로 여러 지점에서 실행
    • joinpoint
      • advice를 적용하는 지점, 스프링은 method 결합점만 제공
    • pointcut
      • advice가 적용되는 대상, 패키지이름/클래스이름/메서드이름을 정규식으로 지정
    • target
      • advice가 적용되는 클래스
    • weaving
      • advice를 주기능에 적용하는 것
  • 구현 과정
    • 타깃 클래스 지정
    • 어드바이스 클래스 지정
    • 설정 파일에서 포인트컷 설정
    • 설정 파일에서 어드바이스와 포인트컷을 결합하는 어드바이저 설정
    • 설정 파일에서 스프링의 ProxtFactoryBean 클래스를 이용해 타깃에 어드바이스 설정
    • getBean() 메서드로 빈 객체에 접근해 사용

ex) 보조기능인 timer(aspect)를 calculator(pointcut)에 적용

  • 진짜 서비스기능을 넣는 것이 아닌 Proxy객체를 대신 넣어주는 것

스프링 MVC의 특징


  • 모델 2 아키텍처 지원
  • 스프링과 다른 모듈과의 연계가 쉬움
  • 타일즈나 사이트메시 같은 View 기술과의 연계가 쉬움
  • 태그 라이브러리를 통해 message 출력, theme 적용 그리고 입력 폼을 보다 쉽게 구현할 수 있음04

Web.xml 경로 오류


  • / 경로로 매핑하면 다른 리소스 같은 경로도 다 서블릿으로 들어와 요청을 받을 수 없음
  • ✅ 해결 방법 1: DefaultServletHttpRequestHandler 사용 (Spring MVC)
    • Spring에서는 static 리소스를 default servlet에 넘겨주기 위한 설정이 필요합니다.
    • 📁 예: mvc:default-servlet-handler (XML 기반)
    <mvc:default-servlet-handler/>
    
    • 📄 예: WebMvcConfigurer (Java Config 기반)
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    

✅ 해결 방법 2: 리소스 핸들러 등록

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/resources/");
}
  • 그럼 /resources/style.css 요청은 /resources/ 폴더에서 서빙됨.

🔚 요약

설정 정적 리소스 처리

<url-pattern>/</url-pattern> 못함 (서블릿이 가로챔)
*.do 정적 리소스는 서블릿으로 안 감 (OK)
해결 방법 default-servlet-handler 설정 또는 리소스 핸들러 등록

MyBatis


  • jdbc로 구현했을 때 반복적인 sql, 복잡한 설정 등을 간편하게 할 수 있도록 도와줌
  • sql 실행 결과를 자바 Beans 또는 Map 객체에 매핑 해주는 Persistence 솔루션으로 관리
  • xml로 sql을 따로 분리
  • iBatis의 후속
  • SQL Mapper
  • 파라미터 자동으로 매핑 (객체)
  • 실행 결과 자동으로 매핑 (객체)
  • 동적(Dynamic) SQL
@Repository
public class MemberDAO {

	@Autowired
	private SqlSessionTemplate sst; // 자동주입
	
	public List<MemberVo> all() {
		return sst.selectList("member.all"); //네임스페이스.아이디
	}
}

  • 파라미터가 없는 경우

http://mybatis.org/dtd/mybatis-3-mapper.dtd>">
		SELECT * FROM MEMBER;
	

  • 파라미터가 있는 경우

http://mybatis.org/dtd/mybatis-3-mapper.dtd>">
		SELECT * FROM MEMBER WHERE id=#{id}
	

package chap06;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import chap04.MemberVO;

@Controller
public class MemberController {

	@Autowired
	private MemberDAO dao;
	
	@GetMapping("/member/all")
	public void all(Model model, MemberVO vo) {
		model.addAttribute("list", dao.all());
		System.out.println(dao.all());
	}
}

?id=lee → 컨트롤러가 MedelAttribute로 파라미터를 “객체”로 받아서 → DAO → SQL

SQL : SELECT * FROM t_member WHERE id=? 1,”lee”

타입은 클래스 parameterType="chap06.MemberVO”

  • DAO에서 실행할 때
  • SqlSessionTemplate 객체 주입받아
  • 객체.메서드명(”namespace.id”)
  • 객체.메서드명(”namespace.id”, 파라미터)
  • 메서드
    • selectList() : 여러 개(목록)
    • selectOne : 하나
    • insert(), update(), delete()
  • #{변수명} : PrepareStatement
    • ?로 들어갈 때
  • ${변수명} : Statement
    • 있는 그대로 들어갈 때 (ex) tableName)

메모


  • 프로젝트 세팅 시 리소스 경로 수용을 위해 MvcConfig에 아래 함수 넣기
// 정적리소스 처리(스프링이 아니라 톰캣이 처리하도록) 활성화
// img, css, js..
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer config) {
	config.enable();
}
  • 비즈니스 로직이 필요 없는 페이지
    • 컨트롤러 파일을 만들지 않아도 연결됨
	// 비즈니스 로직이 필요없는 페이지
	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/home.do").setViewName("home");
	}
  • hibrernate = jpa
728x90
반응형

'BackEnd' 카테고리의 다른 글

6/5 - Mapper 클래스, 트랜잭션 제어  (5) 2025.06.06
6/4 - MariaDB, Log4JDBC  (0) 2025.06.06
Spring Lagacy Project, Spring MVC, MyBatis 인텔리제이에서 세팅하기  (0) 2025.06.03
5/30 - Spring, AspectJ  (1) 2025.06.01
5/29 - MVC  (0) 2025.06.01