본문 바로가기
레거시

2022.03.08~03.10 의 기록

by GroovyArea 2022. 3. 9.

 3일 계획

=>  공부 관련

1) 스프링 개구리책 완독 후 노션 및 블로그 정리

2) MVC 객체지향 리팩토링 하루종일 (9일 오늘)

3) 기술 질문 답변 노션 정리 및 SOLID 예제 프로그래밍

 

=> 파이널 프로젝트 관련

1) DB 테이블 완성 및 select JOIN 대략적인 쿼리문 작성

2) git 협업


 문제 정리

1. 객체 간의 관계

> 단일 책임 원칙으로 클래스를 분리

Model을 세분화

2. 내부 로직을 구현하는 것은 Model에서 일어나지 않아야 한다

> 상수의 나열인 enum 클래스에서 해결

매개변수로 받아와 해당되는 enum 그 자체의 타입 값을 반환 (else는 객체지향 생활 체조 원칙에 위배되기 때문에 생략)

3. setter 메서드의 생략 (불변성을 지켜라)

> 생성자의 주입으로 해결

객체가 확실한 특징을 지니고 있으면 외부에서 함부로 속성을 변경하게 해서는 안된다. 

4. 값 자체의 비교보다 타입의 의미를 더 살려서 비교

> 타입을 적극적으로 사용하여 같은 타입끼리의 비교가 코드 작성의 가독성이 좋다.

 

5. 모델에서 뷰 의존을 하지 않기 위해 컨트롤러에서 enum 클래스 메서드를 통해 view 메서드 호출

게임 결과에 따른 view를 출력하는 메서드 추가

6. 컨트롤러에서 직접 로직을 처리하기 보다 외부 (enum) 에서 로직을 받아 메서드 호출

Enum에서의 메서드 호출

7. 플레이 정적 변수의 처리 여부

> 어디에다 옮겨야 할지 고민 좀 해보자

메서드로의 호출만 다루자. 정적 변수는 외부에서 주입시키는 것으로 고민대상!


 개인 공부

MVC 중간 점검 (거의 완성 되가는듯.)
클래스 책임 재분리
자동 변수 의존 주입 / setter를 제거한 대신 생성자로 주입
불변성을 적용하기 위해 final 필드 선언 및 메서드로 값 얻기 객체지향식 설계


▶ 수업 내용

 

Spring Framework DI

1. 의존 주입

autowire 속성

  • 필드의 자료형이 인터페이스인 경우 자식클래스의 Spring Bean 객체가 여러개 등록된 경우 의존관계 설정 시 UnsatisfiedDependencyException 예외 발생
  • contructor 속성 : 필드의 자료형과 같은 자료형의 Spring Bean 객체를 이용하여 Spring Container가 자동으로 의존관계를 설정 - Constructor Injection

2. Annotation

@Component

  • 클래스를 Spring Bean으로 등록하기 위한 어노테이션
  • ⇒ 클래스명을 beanName으로 자동 설정하며 value 속성을 사용하여 beanName 변경 가능

@Autowired

  • Spring Bean 객체로 의존관계를 자동 설정하는 어노테이션
  • ⇒ bean 엘리먼트의 autowire 속성의 [byType] 속성값과 동일한 방법으로 의존관계 설정 - Setter Injection
  • ⇒ 필드의 Setter 메서드를 선언하지 않아도 Setter Injection 기능 제공
  • 문제점 ) 필드의 자료형이 인터페이스인 경우 자식클래스의 Spring Bean 객체가 여러 개 있으면 의존 관계 설정 시 UnsatisfiedDependencyException 예외 발생
  • 해결법-1) Spring Bean으로 등록된 자식클래스 중 하나의 beanName을 필드명과 같은 이름으로 변경
  • ⇒ 자식클래스의 Spring Bean 객체가 여러 개 있는 경우 autowire 속성의 [byName]과 같은 방법으로 의존 관계 설정
  • 해결법-2) @Qualifier 어노테이션을 사용하여 의존관계를 설정
  • @Qualifier : 의존관계를 설정하기 위한 Spring Bean 객체를 선택하기 위한 어노테이션
  • ⇒ @Autowired에 종속된 어노테이션
  • value 속성 : 의존관계를 설정하기 위한 Spring Bean 객체의 beanName을 속성값으로 설정
  • ⇒ 다른 속성이 없는 경우 속성값만 설정 가능

@Repository

  • DAO 클래스를 Spring Bean으로 등록하기 위한 어노테이션
  • ⇒ 클래스명을 beanName으로 자동 설정하며 value 속성을 사용하여 beanName 변경 가능

@Service

  • Service 클래스를 Spring Bean으로 등록하기 위한 어노테이션
  • ⇒ 클래스명을 beanName으로 자동 설정하며 value 속성을 사용하여 beanName 변경 가능
  • ⇒ trycatch가 내장됨

@Resource

  • Spring Framework @Autowired 어노테이션을 바탕으로 만들어진 어노테이션
  • ⇒ JDK 라이브러리에 의해 제공되는 어노테이션 - 다른 Framework에서도 사용 가능
  • ⇒ 기본적으로 autowire 속성의 [byName]과 같은 방법으로 의존관계 설정

@Inject

  • Spring Framework @Autowired 어노테이션을 바탕으로 만들어진 어노테이션
  • ⇒ JDK 라이브러리에 의해 제공되는 어노테이션 - 다른 Framework에서도 사용 가능
  • ⇒ 기본적으로 autowire 속성의 [byName]과 같은 방법으로 의존관계 설정

 

Spring AOP

  • 관점 지향 프로그래밍
  • OOP의 문제점을 개선하기 위해 나온 프로그래밍
  • 메서드에 중복 코드가 존재할 경우 중복코드 대신 사용될 메서드 선언
  • ⇒ 중복 코드를 최소화하여 유지보수의 효율성 증가
  • 내가 표현하고자 하는 정보를 클래스 하나로 만드는 것 - 추상화
  • 로그 처리, 보안, 트랜잭션 관리, 예외사항 처리 등의 코드를 단일 모듈로 각각 작성하고 필요한 시점에 핵심코드를 삽입하여 동작하게 하는 것

 

핵심 관심 모듈(Core Concern Module)

  • 핵심관심코드가 작성된 메서드
  • ⇒ 핵심 관심 코드 : 메서드가 제공하는 기능을 구현하기 위한 핵심 명령

횡단 관심 모듈(CrossCutting Concern Module)

  • 횡단 관심 코드가 작성된 메서드
  • 횡단 관심 코드 : 핵심관심코드 실행 전 또는 후에 동작될 보조적인 명령
  • ⇒ 로그 처리, 보안(권한) 처리, 트랜잭션 처리, 예외 처리 등의 명령
    • 핵심관심모듈을 기준으로 횡단관심모듈이 삽입될 위치 표현
  • JoinPoint
    • 핵심관심모듈을 기준으로 횡단관심모듈이 삽입될 위치 표현

XML

aop 구현 시 namespace에서 추가

  • config : Spring AOP (AspectJ)를 구현하기 위한 상위 엘리먼트
    • aspect : 핵심관심모듈에 횡단관심모듈을 원하는 위치(JoinPoint)에 삽입되어 실행되도록 설정하는 엘리먼트
    • ⇒ 핵심관심모듈을 PointCut을 사용하여 타겟메서드로 설정
    • ref 속성 : 횡단관심모듈이 선언된 Spring Bean 객체의 beanName을 속성값으로 설정
      • before : 타겟메서드 앞에 횡단관심모듈을 삽입하기 위한 엘리먼트 - JoinPoint
      • method 속성 : 삽입되어 실행될 횡단관심모듈의 메서드명을 속성값으로 설정
      • pointcut 속성 : execution 또는 within 중 하나를 속성값으로 설정
      • ⇒ 핵심관심모듈 중 원하는 메서드를 타겟메서드로 지정하기 위한 정보를 속성값으로 설정
      • execution 속성값 : PointCut 표현식을 이용하여 타겟메서드 지정
      • within 속성값 : 클래스(Spring Bean)의 모든 메서드(핵심관심모듈)를 타겟메서드로 지정
      • ⇒ pointcut 속성값으로 연산자 사용 가능 : !, &&, ||
      • execution 속성값을 이용하여 타겟메서드를 지정하는 방법
      • 형식) execution([접근지정자] 반환형 [패키지명.클래스명.]메서드명(자료형, 자료형, ....))
      • ⇒ 메서드의 머릿부를 표현하여 타겟 메서드 지정 - 패턴문자 사용 가능
      • ⇒ 클래스 대신 인터페이스 사용 가능 - 인터페이스를 상속받은 모든 자식 클래스 표현
      • ⇒ 반환형 또는 매개변수의 자료형이 클래스인 경우 패키지를 포함하여 표현
      • pointcut 관련 패턴문자 : ..(0개 이상), *(1개 이상), +(0개 또는 1개)

  • within 속성값을 이용하여 타겟메서드를 지정하는 방법
  • 형식) within(패키지명.클래스명)
  • ⇒ Spring Bean으로 등록된 클래스의 모든 메서드를 타겟메서드로 지정
  • ⇒ 클래스명은 pointcut 관련 패턴문자 사용 가능
  • ⇒ 클래스 대신 인터페이스 사용 불가능
  • pointcut : 핵심관심모듈을 타겟메서드로 지정하기 위한 엘리먼트
  • ⇒ Pointcut 설정을 재사용하여 유지보수의 효율성 증가
  • expression 속성 : execution 또는 within 중 하나를 속성값으로 설정
  • ⇒ 핵심관심모듈 중 원하는 메서드를 타겟메서드로 지정하기 위한 정보를 속성값으로 설정
  • id 속성 : pointcut를 구분하기 위한 식별자를 속성값으로 설정
  • pointcut-ref : pointcut 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • ⇒ 타겟메서드를 지정하는 정보를 제공받아 사용
    • after : 타겟메서드 (핵심관심모듈) 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
    • ⇒ 타겟메서드에서 발생되는 예외와 상관없이 횡단관심모듈이 실행
    • after-returning : 타겟메서드 (핵심관심모듈) 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
    • ⇒ 타겟메서드가 정상적으로 동작된 경우 횡단관심모듈이 삽입되어 실행 (after과는 예외 발생 여부 상관 없이)
    • after-throwing : 타겟메서드 (핵심관심모듈) 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트
    • ⇒ 타겟메소드에서 예외가 발생된 경우 횡단관심모듈이 삽입되어 실행
    • around : 타겟메서드 (핵심관심모듈) 앞과 뒤에 횡단관심모듈을 삽입하기 위한 엘리먼트

Pointcut 표현식이 중요함

프로그램을 개발하면서 모르는 부분을 된다고 넘어가지 말자.

반응형

'레거시' 카테고리의 다른 글

2022.03.14의 기록  (0) 2022.03.14
2022.03.11~03.13의 기록  (2) 2022.03.12
2022.03.07 의 기록  (0) 2022.03.07
2022.03.05~03.06 의 기록  (0) 2022.03.05
2022.03.03 의 기록  (0) 2022.03.03