CS 지식/네트워크 & 서버

1. cs 지식 - 백엔드

dev.ojin 2024. 3. 9. 18:37

1. WAS - WS 차이 설명

WAS : 웹 어플리케이션 서버 / 비즈니스 로직 구현 가능 / EX. 톰캣, php, ASP, .NET 

WS : 웹 서버 / 비즈니스 로직 구현 불가 / Nginx, Apache 등

 

2. 스프링 프레임워크 무엇이죠?

스프링 프레임워크 : 자바 개발을 편리하게 해주는 오픈소스 프레임워크

키워드로 살펴보는 특징 : #경량컨테이너 #제어의역전(IoC) #의존성주입(DI) #관점지향프로그래밍

 

#경량컨테이너 : 각각의 객체 생성부터 소멸까지 라이프 사이클 관리 및 스프링으로부터 필요한 객체 얻어오기 가능

#제어의역전 : IoC이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모, 결합이 느슨해야 유지보수가 좋다.. 

컨트롤의 제어권이 개발자가 아닌 프레임워크에 있음 -> 필요에 따라 스프링에서 사용자의 코드를 호출함

#의존성주입 : DI, 각각의 계층이나 서비스들간에 의존성이 존재할 경우, 프레임워크가 서로를 연결시켜 준다.. (인싸 프레임워크)

#관점지향프로그래밍 : 트랜잭션, 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 -> 해당 기능을 분리해서 관리 가능

 

 

3. @RequestBody, @RequestParam, @ModelAttribute의 차이 설명

 

@RequestBody : 클라이언트가 전송하는 JSON 형태의 HTTP body 내용을 MessageConverter을 통해 Java Object로 변환시켜주는 역할을 함 (Gson, Java Object 이런 거 말할때 그래서 @RequestBody를 쓰라고 했던 것)

 

@RequestParam : 1개의 HTTP 요청 파라미터를 받기 위해 사용함, @RequestParam의 기본 세팅은 true이기 때문에, 무조건 반드시 해당 파라미터가 전송이 되어야 함. 그런데 만약 빈손으로 왔다? (전송이 되지 않았다면) 400 error를 유발함

그래서 개발을 하다가, 반드시 필요한 변수가 아니라면 required의 값을 false로 바꿔서 400 에러가 안나타나게 세팅해야 함

 

@ModelAttribute : HTTP Body 내용과 HTTP 파라미터의 값들을 생성자, Getter, Setter를 통해 주입하기 위해 사용함

 

4. Spring Boot와 Spring 프레임 워크 차이점

가장 큰 차이점 : 개발환경 구축할 당시에 체감하게 되는 거 같음, 왜냐하면 Auto Configuration 차이때문인데

스프링은 프로젝트 초기에 환경설정을 내 손으로 해줘야 하는 편인데,

스프링 부트는 환경 설정의 대다수가 자동화되어있어서, 정말.. 나는.. 개발할 의지와..희망과..용기와..행동력만 가지고 있음 된다..!

 

 

5. Spring MVC가 뭐죠

Model - View - Controller 3단 레이어 구조를 가진, 디자인 패턴

 

Model : (DAO,DTO, Service) 데이터 관리, 비즈니스 로직을 처리하는 부분

View : (html, jsp, thymeleaf) 화면 구성, REST API로 서버 구현시, json 응답으로 구성되는 부분

Controller : 사용자의 요청을 처리하고, Model과 View를 중개하는 역할

 

Model과 View는 서로 연결되어 있지 않기 때문에, Controller가 사이에서 중개 매체, 통신 매체가 되어준다.

 

6. MVC 흐름으로, 클라이언트의 요청 ~ 화면 반환까지 일련의 과정을 말로 풀어서 설명해보세요

 

1) 클라이언트가 url을 통해 요청을 전송함

2) 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어떤 컨트롤러에게 온 요청인지 샅샅이 찾는다

(url에 있는 도메인과 일치하는 매핑을 가진 컨트롤러를 찾으러 감..)

3) 디스패처 서블릿은 핸들러 어댑터에게 클라이언트가 전송한 요청의 전달을 맡김

4) 핸들러 어댑터는 해당 컨트롤러에게 요청의 내용을 전달하고..

5 ) 그 해당 컨트롤러는 Model 레이어로 가서, Model 레이어에 있는 비즈니스 로직을 처리한 후에, 돌아와서 반환할 화면 view의 이름을 반환한다

6 ) 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰 찾는다(뷰의 명칭과 일치하는 파일이 어딨는지 찾음)

7 ) 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가하여 담는다

8) 데이터가 추가된 뷰를 반환한다.

9 ) 사용자는 요청에 대한 응답을 받게 되는 것이다.

 

7. 제어의 역전의 개념을 설명하세요

 

제어의 역전 : IoC, 모든 객체에 대한 제어권이 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 말합니다.

그래서 스프링에서는 IoC 컨테이너에 객체를 생성하면, 컨테이너가 객체끼리 의존성을 주입하는 역할을 하게 됨

이때, 컨테이너에 등록한 객체 = 빈 이라고 함

 

8. 의존성 주입은 머죠

 

의존성 주입 : DI, 필요한 객체를 직접 코드를 쳐서 생성하는 것이 아니라, 외부에서 객체를 받아서 사용하는 것을 말함

이를 통해 객체간의 결합도를 느슨하게 하며, 코드의 유지보수성 및 재사용성을 높일 수 있음

 

의존성 주입은 세가지가 있는데

ㄱ. 생성자 주입

ㄴ. 필드 주입

ㄷ. 세터 주입 이렇게 세가지가 있음

 

보통 개발자들은 생성자를 통한 주입 방법을 추천함. 왜냐하면 ㄱ.순환 참조를 방지 ㄴ.불변성을 지님 ㄷ.테스트에 용이 하기때문

 

9. 관점 지향 프로그래밍은 무엇이죠? 그리고 언제 사용할 수 있나요?

관점 지향 프로그래밍 : 영어로 AOP, 핵심 비즈니스 로직에 있는 공통 관심사항(보안, 트랜잭션, 로깅)을 분리하여 각각을 모듈화 하는 것을 의미함(단위화, 밀키트화, 코인육수st)

 

언제 사용하나? : 핵심 비즈니스 로직에 부가기능을 하는 모듈이 중복되어 관통하여 분포되어 있는 경우 사용함, aka 클린코딩을 하기 위해

 

관점 지향 프로그래밍의 장점 : 중복 코드 제거, 재활용성의 극대화, 변화수용의 용이성

 

10. 롬복 라이브러리는 뭐야

 

lombok : 어노테이션 프로세싱을 담당하는 라이브러리

 

11. 서블릿은 뭘까요

서블릿 : 영어로 Servlet, 클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술을 뜻함

서블릿 => Spring MVC에서 컨트롤러로 이용되며, 사용자의 요청을 받아 비즈니스 로직에 따라 처리한 후 결과(응답)을 반환함

 

요약 : 자바를 사용해 웹 어플리케이션을 만들기 위해 필요한 기술

 

12. VO, DAO, DTO 대해 설명

  • VO : Value Object, 실제 데이터만 저장하는 객체
  • DAO : Data Access Object, DB 데이터에 접근하기 위한 객체 (Repository나 Mapper에 해당함)
  • DTO : Data Transfer Object, 각 계층간의 데이터 교환을 위한 객체 (계층..? 어떤 계층..? Controller, View, Business Layer, Persistent Layer 레이어 계층구조를 말함)
  • BO : Business Object, 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체를 뜻함 (Service에 해당)

13. 대용량 트래픽에서 장애가 발생하면 어떻게 대응할 것인지?

스케일 업 혹은 스케일 아웃을 통해 대응할 것

 

스케일 업을 통해서 하드웨어 스펙을 향상할 것이고

스케일 아웃을 통해 서버 갯수를 추가해 시스템을 증가할 것

 

14. 싱글톤 패턴이란?

스프링에서 bean 생성하면, 별다른 설정이 없으면 싱글톤이 디폴트로 적용됨

스프링은 컨테이너를 통해서 직접 싱글톤 객체를 생성하고 관리하는데, 요청이 들어올 떄마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유함 (효율성을 극대화하기 위해, 약간 재탕)

 

15. @Transactional 동작원리에 대해 설명하기(이전에 내가 쓴 필기까지 있으니 이건 알아야돼!)

@Transactional을 메소드나 클래스에 어노테이션으로 명시하면, AOP(관점 지향 프로그래밍)을 통해서 타겟이 상속하고 있는 인터페이스 혹은 타겟 객체를 상속한 프록시 객체가 생성되며, 프록시 객체의 메소드를 호출하면 타겟 메소드 전 후로 트랜잭션 처리를 수행함

 

16. JPA n+1 문제와 발생하는 이유, 해결법이 무엇인지

N + 1 문제 : 1번의 쿼리를 보냈을 때, 의도하지 않았는데... N번의 쿼리가 추가적으로 실행되는 에러를 의미

위와 같은 문제가 발생하는 이유 : 연관관계를 가진 엔티티를 조회할 때, 한쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문에 N번의 쿼리가 추가적으로 실행되는 불상사가 발생함

 

해결방법 : (가장 많이 사용하는 해결 방법) Fetch Join을 사용하는 해결법

Fetch Join을 사용하면 미리 두 테이블을 임의로 Join하여 한번에 모든 데이터를 가져오기 때문에 쿼리 추가 실행 N+1 문제를 미연에 방지할 수 있음

 

17. JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에 어떻게 해결할 것인지

보통 JPA는 정적인 상황, 복잡하지 않은 쿼리에서 주로 사용하기 때문에 복잡한 쿼리와 동적 쿼리 사용에 있어서 문제가 발생하게 됨

그럴때는 JPQL과 Querydsl을 사용하여 그 문제를 해결하겠음