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를 통해, 원하는 형태의 결과값을 반환할 수 있다 - 여러개의 값 반환 가능 + 사용자가 원하는 형태로도 반환 가능
- executeAndReturnKey란? - 참고: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/simple/SimpleJdbcInsertOperations.html#executeAndReturnKey-org.springframework.jdbc.core.namedparam.SqlParameterSource- - INSERT문을 수행하고, 생성된 key를 반환한다 - auto generated key가 구현되어 있어야 한다
- KeyHolder란? - 참고: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/support/KeyHolder.html - Key를 반환받는 인터페이스 - auto-generated key를 만드는데 사용됨 - 주로 key를 들고있는 List로 반환됨 - 거의 모든 어플리케이션이 row 하나당 키 하나 - getKey(번호 반환) 혹은 getKeyAs(다른 타입으로)로 키를 받음
- 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 요구 받는 부분 + 처리 결과를 사용자에게 보여주는 부분