1. VO는 무엇이며 언제 사용하는가?
자바빈의 일종으로 값 객체로서 데이터베이스 DML에 대응되는 CRUD 메서드들의 모듈인 DAO, 직렬화(객체의 내용을 파일 스트림으로 만듦) 등에서 데이터 유출입시 값을 일시적으로 보유하도록 사용하는 객체.
보통 일반적으로 필드는 보안(직접 접근 방지)을 위해 private 접근 제어자를 활용하는 경우가 많고 외부 접근시 필드들에 대한 getter/setter 메서드를 주로 활용합니다. lombok 등의 유틸리티를 사용하면 애너테이션 표기만으로 각종 관련 메서드들을 자동생성해주는 기능을 활용할 수 있다.
2. 관련 질문) getter/setter는 무엇인가?
VO나 DTO(TO)등의 자바빈 객체에서 멤버 필드에 대해 멤버 필드의 직접 접근을 막고 멤버 필드들을 가공할 구문을 삽입하고자 사용하는 필드별로 구성된 메서드. set으로 시작하여 주로 멤버 필드값 가공 및 설정 역할을 하는 것이 setter(set method)이며 외부에 멤버 필드값을 그대로 혹은 가공하여 내보낼 때(리턴) 사용하는 get으로 시작하는 메서드가 getter이다.
3. 관련 질문) toString 오버라이딩은 왜 쓰는가?
자비빈 객체의 멤버 필드들의 현황을 한꺼번에 확인하고자 할 때 객체를 직접 인쇄(로깅:logging)하게 되면 자동적으로 toString이 호출되게 되어 코드량을 절약할 수 있고 간편하기 때문에 보통 오버라이딩하여 많이 사용한다.
4. 관련 질문) hashCode, equals를 오버라이딩하는 이유는?
원래는 각각 객체 고유값을 인쇄하거나 객체 고유값이 같은지를 역할을 하지만 오버라이딩하여 본래 목적과는 다르게 두 자바빈 객체 간의 자바빈 멤버 필드들을 일일이 확인하는 번거로움을 덜기위해 사용할 수 있다. 멤버 필드들의 값이 하나라도 다르면 hashCode 값이 다르게 나오고 equals도 false가 리턴되지만 모두 같으면 각각 같은 해쉬 코드 값이 출력되고 true가 리턴된다.
5. 관련 질문) 복사 생성자는 무엇인가?
오버로딩된 생성자 중 생성자의 인자에 다른 객체가 유입되어 멤버 필드들의 내용을 그대로 다른 자바빈의 멤버들에 복사할 때 유용하게 사용할 수 있다. 가령 회원 가입 모듈에서 인자를 입력받은 DTO의 멤버 필드들이 20개 정도인데 이것을 데이터베이스의 데이터에 접근하는 VO의 멤버필드가 10개라고 한다면 일일이 setter를 사용하여 VO의 값을 설정할 수도 있지만 복사생성자를 활용하면 VO 객체 생성시 한번에 처리하므로 이를 활용하여 호출하는 처리루틴에서 코드량을 줄일 수 있다.
ex) public MemberVo(MemberDTO memberDTO) { ... }
6. 관련 질문) DTO와 VO는 어떠한 차이가 있는가?
둘다 많이 사용하는 자바빈으로써 비슷한 성격을 가지고 있으며 간혹 혼용하는 경우도 있다. 데이터 전송(Data Transfer)을 강조하면 TO(DTO), 데이터베이스 등에 데이터 유출입에 관여하거나 값(value)을 일시적으로 가지고 있는 역할을 강조하면 값 객체(VO)라고 할 수 있다. 보통 사용시 ~DTO(Dto), ~Vo(Vo) 등의 접미사를 사용하여 구분하기도 한다.
7. 관련 질문) DAO는 무엇인가?
데이터베이스의 CRUD(생성/조회/수정/삭제) 등의 역할(기능)을 수행하는 메서드들로 구성된 자바빈 객체. 일반적으로 보안을 위해 상속하지도/받지도 않는 싱글턴(singleton) 형태로 생성하여 주로 사용하며 데이터베이스 제어를 위해 빈도있게 사용하는 모듈이다.
8. 트랜잭션은 무엇인가?
데이터베이스에서 보안적인 데이터 유출입을 위해 사용하는 일의 처리 단위. 보통 성능 측정시 TPS 라는 단위를 사용하여 초당 트랜잭션을 얼마나 처리하는지가 성능의 지표가 되기도 한다.
특히 프로그래밍에서 트랜잭션을 제어할 수 있는데 TCL(트랜잭션 제어 언어)인 커밋(commit) 이라는 승인 명령과 롤백(rollback)이라는 취소 명령을 사용하여 최종적으로 데이터의 변경을 반영할 것인지를 결정할 수 있다. 보통 자바의 경우는 예외가 발생할 경우 롤백 처리하는 경우가 많다. 주로 순수 스프링(Spring)의 경우는 DML(insert, update, delete)에 대해 전파정책(propagation)정책을 사용하여 제어하며 xml 및 자바 애너테이션(annotation)으로 설정정보(메타데이터)를 작성하여 제어하는 경우가 많으며 간편하게 사용하기 위해 AOP의 어드바이스(advice)나 혹은 @Transactional 애터네이션에 전파정책(propagation)을 반영하여 사용하는 경우가 많다.
9. 관련 질문) 프로젝트 작성시 트랜잭션을 어떻게 사용하였는가?
주로 게시판, 회원 관리 등 데이터베이스 작업이 들어가는 모듈에서는 대부분 스프링 프로그래밍 방식으로 적용하였습니다.
10. 관련 질문) 트랜잭션의 속성인 ACID는 무엇인가?
원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)
참고) https://ko.wikipedia.org/wiki/ACID
11. 관련질문) 스프링에서 트랜잭션을 제어하는 과정을 간략히 설명하십시오.
먼저 관련된 라이브러리 정보(spring transaction, mybatis, mybatis-spring, DB 드라이버, AOP 관련 라이브러리 등) 를 메이븐(maven)이나 그레이들(gradle)을 사용하여 라이브러리 의존성 정보를 주입하여 설정합니다.
데이터베이스에 대한 명세를 데이터소스(dataSource) 자바빈을 XML이나 애너테이션을 형태로 작성하여 데이터베이스 관련 속성을 삽입하고(JDBC 직접 연결, apache DBCP, hikariCP 등) MyBatis 등의 ORM 프레임웍을 사용한다고 전제하였을 경우 이를 연결하여 참조하는 Mybatis의 세션(session) 자바빈(세션빈)을 작성하고 다시를 이를 참조하는 세션 템플릿 자바빈을 작성하여 DAO 등에서 와이어링(wiring) 하여 씁니다. 만약 트랜잭션을 사용한다면 Mybatis 세션빈과 별도로 생성한 트랜잭션 매니저(transaction manager) 빈을 설정하여 mybatis 빈과 연결하여 사용하며 경우에 따라 AOP advice(어드바이스) 를 참조하도록 조치하여 트랜잭션 제어시 활용하기도 합니다. 관련 DAO 메서드를 별도로 작성한 후 Service 단에서 트랜잭션을 제어하되 @Transactional 애너테이션을 활용하면 트랜잭션의 전파정책을 간단히 표현할 수 있습니다. 읽기 용도로 사용하는 get 계열(read)의 메서드들은 readonly 처리를 하면 적절합니다.
'기술면접' 카테고리의 다른 글
[기술면접준비] REST API 란? (REST, REST API, RESTful API) (0) | 2022.05.09 |
---|---|
기술면접준비(5)_ 자주 나오는 기술문제 (0) | 2021.06.23 |
기술면접준비(4)_100선-1 (0) | 2021.06.09 |
기술면접준비(3)_MVC패턴/ model-1과 model-2차이점 (0) | 2021.06.07 |
기술면접준비(2)_AOP/IOC컨테이너/DI (0) | 2021.06.07 |