" SPRING을 쓰면 JSP로 웹 개발했을 때보단 코드 치는 양이 적어 편하긴한데, 머리속으로 SPRING 개념들이 정리가 되지않아 뒤죽박죽 혼란스러워서 고민 끝에 POST를 하기로 결심했다. (많이 부족하겠지만, 내가 이해한 기반으로 정리할 예정이다.) "
Java 기반의 오픈소스 Back-end 프레임워크으로 그냥 SPRING이라고 부른다.
간단하게 말하면 JAVA/Kotlin 기반의 프로그램을 쉽고 빠르게 만들 수 있도록 도와주는 도구(프레임워크)라고 말할 수 있다.
이 SPRING은 의존성 주입(DI; Dependency Injection)과 제어역전(IOC; Inversion of Control), 관점 지향 프로그래밍(AOP)이 가장 중요한 요소인데, 이 각각의 요소들은 느슨한 결합(Loose Coupling)을 달성할 수 있게 한다.
느슨한 결합으로 개발한 프로그램은 단위 테스트를 하기 용이하다.
느슨한 결합에 관한 POST는 강한결합 vs. 느슨한 결합에서 내 나름대로 정리해보았다.
@Controller
public class MemberController{
private memberService memberService;
@Autowired
public Controller(MemberService memberService){
this.memberService = memberService;
}
}
@Controller
public class MemberController{
@Autowired
private MemberService memberService;
}
@Controller
public class MemberController{
private MemberService memberService;
@Autowired
public setService(MemberService memberServicememberService){
this.memberService = memberService;
}
}
-> 스프링은 생성자 주입(Constructor Injection) 방식을 권장한다.
package ezenweb.web.domain.todo;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
//1.객체 생성
@Repository
public interface TodoEntityRepository extends JpaRepository<TodoEntity, Integer>{
}
package ezenweb.web.service;
import ezenweb.web.domain.todo.PageDto;
import ezenweb.web.domain.todo.TodoDto;
import ezenweb.web.domain.todo.TodoEntity;
import ezenweb.web.domain.todo.TodoEntityRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service //제어 역전(IoC) => 스프링이 관리해줌
@Slf4j
public class TodoService {
@Autowired
TodoEntityRepository todoEntityRepository; //2. 의존성 객체 주입(DI)
//할일 출력
@Transactional
public PageDto getTodo(int page){
List<TodoDto> todoDtoList = new ArrayList<>();
Pageable pageable = PageRequest.of(page-1, 5, Sort.by(Sort.Direction.DESC, "id"));
Page<TodoEntity> entity = todoEntityRepository.findAll(pageable); //의존성 객체 메소드 호출
entity.forEach((e) -> {
todoDtoList.add(e.toDto());
});
return PageDto.builder()
.totalCount(entity.getTotalElements())
.totalPage(entity.getTotalPages())
.todoList(todoDtoList)
.page(page)
.build();
}
의존성 감소
코드량 감소
테스트 용이
AOP는 Aspect Oriented Programming의 약자로 OOP를 좀 더 발전시키기위한 개념이다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하여 재사용할 수 있도록 지원하는 것을 의미한다.
핵심적인 관점 : 우리가 적용하고자 하는 핵심 비즈니스 로직
부가적인 관점 : 핵심 비즈니스 로직을 실행하기 위해 행해지는 데이터베이스 연결, 로깅(기록), 파일 입출력 등과 같은 부가적인 것.
위의 사진을 보면 계좌등록, 대출승인, 입출금은 OOP로 프로그래밍이된 것이고, 각 OOP는 기능 작동을 위해 로깅, 보안, 트랜잭션을 하는 코드가 구현(공통된 기능)되어 있다.
이러한 공통 부분 코드를 각각의 OOP 소스코드에서 제거해서 외부를 빼내어 하나의 공통 모듈로 만들 수 있다.
=> 이를 OOP >> AOP(발전된 OOP)기법이라고 한다.
예시로 다시 정리해보면,
핵심관심 : (각 서비스의 핵심! 비즈니스 로직)계좌 등록, 대출 승인, 입출금
횡단관심 : (공통모듈)로깅, 보안, 트랜잭션 등등
AOP의 핵심! 공통모듈을 분리시켜 해당 소스코드가 외부의 다른 클래스에서 존재하는 것
AOP의 장점
aspect
Advice
JointPoint
PointCut
Aspect
Proxy
Weaving
Target
참고 자료