콘텐츠로 이동

2021 04 16

2021-04-16

Spring을 접하면서 생긴 질문

  • @AutoWired가 뭐야? - 참고: https://galid1.tistory.com/512 - 각 상황의 타입에 맞는 IoC 컨테이너 안에 존재하는 Bean을 자동으로 주입 - 의존성을 가지는 부분에 추가하여, 간단히 의존성 주입 받게함 - 생성자, setter에서 사용해줄 수 있음 - 생성자에서 의존성을 주입 받는 경우, 해당 어노테이션 생략 가능 - 애초에 해당 객체 생성될 때 필요해서 알아서 주입됨 - 인터페이스를 주입받는 경우, 다양한 콘크리트 클래스가 빈으로 대기중이면 누굴 넣어줘야 할까? - 콘크리트 클래스 중 @Primary 어노테이션 붙은 친구 넣어주기 - 주입하는 위치에서 @Qualifier을 통해 넣어줄 콘크리트 클래스 명시하기
  • update() VS queryForObject() VS query() - 참고: https://withseungryu.tistory.com/92 - JdbcTemplate - DAO객체에서 DB와 연동하기 위해 SQL 연산을 수행해줌 - update() - SQL 연산을 통해 DB 갱신시 사용하는 메서드 (INSERT, DELETE, UPDATE) - queryForObject() - SQL의 DML (SELECT/INSERT/UPDATE/DELETE) 중 SELECT 실행시 Object 결과 값이 나올 때 사용 - RowMapper 콜백을 사용할 것 - 템플릿으로 부터 ResultSet을 전달받고, 필요한 정보를 추출하여 리턴하는 방식으로 동작 - ResultSet의 로우 하나만을 매핑하기 위해 사용 - query() - 많은 결과값을 처리할 수 있는 메소드! - List를 통해 여러 개의 Row들을 저장할 수 있음
  • RowMapper란? - 참고: https://velog.io/@seculoper235/RowMapper%EC%97%90-%EB%8C%80%ED%95%B4 - queryForObject의 반환 형을 나의 Object로 받고 싶다면 사용해보자 - RowMapper를 통해, 원하는 형태의 결과값을 반환할 수 있다 - 여러개의 값 반환 가능 + 사용자가 원하는 형태로도 반환 가능
  • DI의 여러 방식 간의 차이점? - 참고 1: https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/ - 참고 2: https://jackjeong.tistory.com/41 - 강한 결합 vs 느슨한 결합 - 강한 결합: 객체 내부에서 다른 객체 생성 - 느슨한 결합: 외부에서 생성된 객체를 주입받음, 결합도 낮아지고, 런타입시 의존관계 결정, OCP 준수에 유리 - [생성자 주입] - NPE가 발생할 일이 없다 - 의존관계 주입 안한 경우, Controller 생성이 불가능 - 의존관계에 대한 내용을 외부로 노출시킴으로서 "컴파일 타임"에 오류를 잡아냄 - 순환 참조 방지 - final 작성 가능 - 테스트 작성 유리
    @Service
    public class StationConstructorService {
        private final StationRepository stationRepository;
    
        public StationConstructorService(StationRepository stationRepository) {
            this.stationRepository = stationRepository;
        }
    
        public String sayHi() {
            return stationRepository.sayHi();
        }
    }
    
    @Repository
    public class StationRepository {
        public String sayHi() {
            return "Hi";
        }
    }
    

    - [필드 주입] - 빈 생성후, 필요할 때 주입하려는 빈 찾아 주입 - 불변성 보장 안됨 - 의존성이 클래스 안으로 숨어버림

    @Service
    public class StationFieldService {
        @Autowired
        private StationRepository stationRepository;
    
        public String sayHi() {
            return stationRepository.sayHi();
        }
    }
    
    @Repository
    public class StationRepository {
        public String sayHi() {
            return "Hi";
        }
    }
    

    - [Setter 주입] - 빈 생성후, 필요할 때 주입하려는 빈 찾아 주입 - 현재 인스턴스 필드에 지정된 콘크리트 클래스가 없는대도 객체가 인스턴스화 될 수 있음 - NPE 발생!

    @Service
    public class StationSetterService {
        private StationRepository stationRepository;
    
        @Autowired
        public void setStationRepository(StationRepository stationRepository) {
            this.stationRepository = stationRepository;
        }
    
        public String sayHi() {
            return stationRepository.sayHi();
        }
    }
    
    @Repository
    public class StationRepository {
        public String sayHi() {
            return "Hi";
        }
    }
    

  • 스프링 빈으로 등록하는 여러 방식 간의 차이점? - 참고: https://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in - @Component - generic stereotype for any Spring-managed component - @Repository - stereotype for persistence layer - 영구 데이터를 빼내 객체화시킴 - 영구 저장소에 데이터를 CRUD - @Service - stereotype for service layer - 어플리케이션의 비즈니스로직을 캡슐화 - 트랜잭션 수행 - DB의 상태를 변화시키는 작업 - @Controller - stereotype for presentation layer (spring-mvc) - 사용자와의 최종 접점 - 사용자로 부터 데이터 입력 받거나, 데이터 출력해보이는 계층 - 외부로 부터 Application 요구 받는 부분 + 처리 결과를 사용자에게 보여주는 부분