👶주니어 자바 개발자를 위한 100가지 질문 - Internet, Spring
- -
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다.
처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영!
🕸️ internet
📌 301과 302 상태 코드의 의미와 차이는 무엇인가요?
301과 302는 Redirection 동작을 의미한다. 웹페이지를 새로운 도메인으로 옮겼을 경우 이용자들을 변경된 주소로 자동으로 옮겨가게 만드는데 사용한다. HTTP프로토콜에서 해당 상태 코드로 클라이언트를 지정된 URL로 보낼 수 있다.
301(Permanent Redirection): 301 상태 코드는 사이트가 영구적으로 이동함을 알리는 코드이다. 해당 사이트가 새로운 URL로 영구적으로 이동했음을 알림을 말한다.
이 때, 검색엔진은 사이트 도메인의 이동을 감지하고, 기존 URL에 대한 수집된 정보들을 새로운 URL로 이전한다.
302(Temporarily Redirection): 302 상태 코드는 사이트가 일시적으로 이동했을 말한다.
검색엔진에서도 일시적인 이동임을 알고, 기존의 수집 정보를 넘기지 않고 새로운 URL로 인식한다.
📌 forward와 redirect의 차이는 무엇인가요?

Foward: 포워드는 서버 내부에서 일어나는 호출을 가리킨다. 클라이언트에 요청이 들어오면 서버 내에서 다른 URL로 요청/응답 객체 정보를 유치한 채 재 요청한다. 서버 단에서 재 요청되었기 때문에 브라우저는 이를 알지 못한다.
Redirect: 요청 받은 서버가 클라이언트에게 특정 주소를 알려주고 특정 주소로 재 요청하라고 호출하는 것이다. 그렇기 때문에 요청 객체가 유지되지 않고, 유지하려면 GET방식으로 URL과 함께 호출해야 한다.
활용 방법에서의 차이:
- forward는 보통 서버 내부 요청이므로, 내부 주소를 숨기기 위해서 사용되거나, DB와 같은 정보가 변경되는 요청이 아닌 경우, 새로 고침의 용도로 사용된다.(변경되는 요청을 forward로 처리한다면 중복 요청되는 경우가 발생하기도 한다.)
- redirect는 요청 객체를 유지하지 않기 때문에 새로 고침을 하더라도 중복 요청이 발생되지 않으므로, 서버 내부 변경이 발생될 요청에 새로 고침이 필요한 경우 사용된다.
📌 tcp와 udp의 차이점을 말해주세요.

TCP: TCP는 연결 지향형 데이터 전송방식이다. 특정 회선을 설정하고, 흐름제어, 오류제어를 통해 데이터 전송의 신뢰성을 보장하지만, 느리다는 단점이 있다. 전송시 데이터 보장이 중요할 경우 사용된다.
UDP: UDP는 비연결 지향형 데이터 전송방식이다. 특정 회선이 정해져 있지 않고, 패킷으로 나누어져 목적지를 향해 각각 최적의 경로를 향해 목적지로 전송된다. 빠르다는 장점이 있지만, 불안정하고, 데이터를 받는 순서가 달라질 수 있다는 단점이 있다.
📌 왜 tcp는 3 handshakes를 필요로 하나요? 왜 2개가 아니죠?
3handshake를 사용하는 이유는 tcp는 클라이언트와 서버간 연결성을 보장해야하기 때문에 클라이언트 요청-서버 응답- 클라이언트 응답의 3단계를 거쳐가게 된다.
2번의 handshake가 아닌 이유는 먼저 클라이언트가 ISN(Initial Signal Number)를 서버에게 알려주고 두 번째로 서버도 자신의 ISN을 클라이언트에 전달한다. 마지막으로 클라이언트가 서버의 ISN을 확인했음을 응답하는 것의 3단계로 이루어진다. 2번의 shake보다는 3번의 shake로 빠르고 정확하게 연결을 확인할 수 있는 것이다.
📌 tcp packet은 어떻게 생성되나요?
패킷은 데이터를 안전하게 전송하기 위해 데이터를 쪼개어 전송지 목적지 등 다양한 정보를 담아 목적지로 보내는 데이터 조각이다.
packet은 데이터를 쪼개고 목적지로 전송하기 위해 필요한 목적지, TTL등의 정보를 담아 데이터에 헤더를 추가하는데 이 과정을 ‘캡슐화’ 라고 한다. 캡슐화가 끝난 과정의 데이터 조각을 패킷이라고 말한다.
📌 OSI 7계층에 대해서 설명해주세요.
OSI 7계층: 네트워크 프로토콜이 통신하는 구조를 7개의 계층으로 분리하여 각 계층간 상호 작용 방식을 정해놓은 것이다.
물리 계층: 네트워크 데이터가 전송되는 물리적인 매체 → 전압, 허브 등
데이터 링크 계층: 물리적인 네트워크를 통해 데이터를 전송하는 수단 → 브릿지, 이더넷
네트워크 계층: 실제 네트워크 간에 데이터 라우팅을 담당한다. → 라우터, 스위치(3계층)
전송 계층: 하위 계층에 신뢰 할 수 있는 데이터 전송 서비스를 제공하는 것 → 특정 방화벽 또는 프록시 서버
세선 계층: 두 컴퓨터간의 대화나 세션을 관리하며, 포트연결이라고 한다.
표현 계층: 응용 계층으로부터 전달받은 데이터를 읽을 수 있는 형식으로 변환하는데 표현 계층은 응용 계층의 부담을 덜어주는 역할 이기도 한다. → 유니코드로 인코딩 되어있는 문서를 아스키코드로 인코딩할때
응용 계층: 사용자가 네트워크 자원에 접근하는 방법을 제공한다. → 텔넷, 크롬
📌 get과 post요청의 차이를 말해주세요.
GET방식: 주로 서버에 데이터를 조회할 때 사용한다. URL을 통해서만 데이터를 전달할 수 있기 때문에, 전송되는 데이터에 대한 보안이 취약하고, 길이가 제한 되어 있다.
POST방식: 주로 서버에 데이터를 생성할 때 사용된다. GET과는 다르게 HTTP Body라는 곳에 데이터를 포함하여 전송할 수 있고 해당 데이터는 길이도 없고 노출되지 않기 때문에 중요한 데이터의 전송에도 쓰인다.
📌 어떻게 도메인 간의 요청이 작동하나요?
GET방식: 주로 서버에 데이터를 조회할 때 사용한다. URL을 통해서만 데이터를 전달할 수 있기 때문에, 전송되는 데이터에 대한 보안이 취약하고, 길이가 제한 되어 있다.
POST방식: 주로 서버에 데이터를 생성할 때 사용된다. GET과는 다르게 HTTP Body라는 곳에 데이터를 포함하여 전송할 수 있고 해당 데이터는 길이도 없고 노출되지 않기 때문에 중요한 데이터의 전송에도 쓰인다.
📌 JSONP의 구현 원칙은 무엇인가요?
JSONP: 자바스크립트는 서로 다른 도메인에 대한 요청을 제한하는데, 이 정책을 SOP(Same-Origin Policy)라고 한다. JSONP는 이 정책으로 생기는 이슈에 대한 해결 방법 중 하나이다. <script>의 src 속성을 통해 다른 도메인의 가져오려는 json파일의 위치를 호출하고, json은 콜백 함수를 통해 데이터를 반환한다.
즉, Jsonp를 사용하려면 데이터를 콜백함수로 감싸주어야 한다.
//스크립트 코드
// <http://test.com/result.json>http://test.com/result.json> 파일
callback({
name: "JSONP",
discription: "test"
})
현재는 보안 이슈로 쓰이지 않는 기술이고, 보통 CORS 방식의 HTTP 통신을 사용하여 이슈를 해결하는 것이 좋다.
📌 디자인 패턴에 대해 말해주세요.
소프트웨어 설계, 구현 과정에서 자주 발생하는 이슈들을 코드로 해결하는 방법 들이다. 정확하게 정의되어 있지 않지만 상황에 맞게 사용할 수 있는 템플릿이다.
📌 알고 있는 디자인 패턴이 있으신가요?
싱글톤 패턴
- 클래스의 인스턴스가 단 1개임을 보장하는 패턴이다.
- static과 비교되는 점은 객체성을 띄는 점이다.
정적 팩토리 메서드 패턴
- static 메서드를 통해 간접적으로 생성자를 호출하는 객체를 생성하는 디자인 패턴
- 생성자의 이름을 가독성있게 정의할 수 있다는 장점이 있다.
- 인스턴스에 대한 관리가 가능하다.
팩토리 패턴
- 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하는 패턴
프록시 패턴
- 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아닌 해당 객체를 대항하는 객체를 통해 대상 객체에 접근하는 방식을 사용한다.
- 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있다.
빌더 패턴
- 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다. 생성자에 들어갈 매개 변수를 메서드로 하나하나 받아들이고 마지막에 통합 빌드해서 객체를 생성하는 방식이다.
- 복잡한 객체의 생성을 가독성 있게 바꿔준다.
📌 추상 팩토리와 심플 팩토리의 차이가 무엇인가요?

- 심플 팩토리는 해당 객체의 생성이 구체적으로 정해져 있기 때문에 객체를 다양하게 생성하고 싶은 경우에는 추상 팩토리 패턴을 사용하여 특정 다양한 객체를 만드는 여러 클래스를 만들 수 있다.
🦿 Spring
📌 스프링 사용의 장점은 무엇인가요?
- POJO(Plain Old Java Object) 프로그래밍을 지향함으로써, 특정 기술이나 환경에 구애받지 않는다는 장점이 있다.
- IOC / DI (제어의 역전 / 의존성 주입) 만약 수백개의 클래스가 A라는 클래스를 의존하고 있을 때 A가 C클래스로 변경해야 한다면 의존하는 수백개의 클래스 또한 변경을 해야한다. 하지만 이런 작업을 스프링이 도와주어 의존관계를 맺어준다.
- AOP(관점 지향 프로그래밍) AOP는 어떤 로직을 관점에 나누어서 보고 그 관점을 기준으로 각각 모듈화 하는 것이다. 예를 들어 전체 메서드의 실행시간 측정이라는 관점에서 봤을 때, 기존의 자바에서는 측정 로직을 모든 메서드에 추가해야 하겠지만, 스프링에서는 프록시패턴과, 바이트코드를 활용한 CGLIB을 활용하여 하나의 클래스로만 해당 로직을 구현할 수 있다.
📌 AOP란 무엇인가요?
- AOP(관점 지향 프로그래밍) AOP는 어떤 로직을 관점에 나누어서 보고 그 관점을 기준으로 각각 모듈화 하는 것이다. 예를 들어 전체 메서드의 실행시간 측정이라는 관점에서 봤을 때, 기존의 자바에서는 측정 로직을 모든 메서드에 추가해야 하겠지만, 스프링에서는 프록시패턴과, 바이트코드를 활용한 CGLIB을 활용하여 하나의 클래스로만 해당 로직을 구현할 수 있다.
📌 IOC란 무엇인가요?
- IOC / DI (제어의 역전 / 의존성 주입) 만약 수백개의 클래스가 A라는 클래스를 의존하고 있을 때 A가 C클래스로 변경해야 한다면 의존하는 수백개의 클래스 또한 변경을 해야한다. 하지만 이런 작업을 스프링이 도와주어 의존관계를 맺어준다.
📌 스프링의 메인 모듈은 무엇인가요?
스프링 메인 모듈은 스프링 코어 컨테이너이다. 아래의 주요 기능들을 제공한다.
💉 DI (Dependency Injection, 의존성 주입)
의존성을 외부에서(주로 IoC 컨테이너가) 지정해 주는 것
⏳ IoC (Inversion of Control, 제어 역전)
프로그래머가 작성한 프로그램이 프레임워크의 제어를 받게 되는 소프트웨어 디자인 패턴
🏭 IoC 컨테이너
객체의 생성, 의존성을 관리하는 컨테이너
🐣 빈 (Bean)
Spring IoC Container가 관리하는 자바 객체
스프링이 제어권을 가지고 직접 생성하며 관계를 부여하는 오브젝트
🐔 빈 팩토리 (Bean Factory)
빈을 생성하고 관계를 설정하는등의 제어를 담당하는 IoC 오브젝트
🐓 애플리케이션 컨텍스트 (Application Context)
애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진, 일종의 빈 팩토리라고 볼 수 있다.
ApplicationContext 인터페이스는 BeanFactory 인터페이스를 상속한다.
📌 가장 많이 사용되는 의존성 주입 방법은 무엇인가요?
- 아래 코드와 같은 방식의 생성자 주입 방식이 많이 사용된다. 생성자 호출 시점에 1번만 호출되는 것을 보장하며, 생성자가 1개만 존재하는 경우 @Autowired를 생략해도 자동 주입된다.
- 순수 자바코드만으로도 테스트가 가능하여 다른 생성자 주입에 비해서 많이 사용된다.
@Component
public class CoffeeService {
private final MemberRepository memberRepository;
private final CoffeeRepository coffeeRepository;
@Autowired
public CoffeeServiceImpl(MemberRepository memberRepository, CoffeeRepository coffeeRepository) {
this.memberRepository = memberRepository;
this.coffeeRepository = coffeeRepository;
}
}
📌 스프링 빈은 thread-safe 한가요?
스프링 빈도 일반 싱글톤 패턴을 따르기 때문에 Synchronized 와 같은 동시성 처리가 되어 있지 못하다. 결국 스프링 내에 가변 변수가 존재한다면, 의도치 못하게 변경될 가능성이 있다는 것이다. 하지만 보통 스프링 빈 내부에 가변 변수가 있을 가능성이 없으며, 동시성을 해결하지 않는 이상 두지 않아야 한다.
📌 스프링은 얼마나 많은 bean scope를 유지할 수 있나요?
Bean Scope: 빈 스코프는 말 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다.
스프링은 singleton, prototype 등 여러 빈 스코프를 가지고 있는데 이 외에도 커스텀 스코프를 제작하여 사용할 수 있다. 그러므로 빈 스코프의 개수에 대한 제한은 없다
📌 스프링 트랜잭션을 구현하기 위한 다양한 방법을 말해주세요.
- 어노테이션을 통한 트랜잭션 선언
- @Transactional을 사용하여 트랙잭션을 사용할 수 있다.
- 트랜잭션 처리를 코드에서 직접 수행하지는 않는다.
public class UserService { @Transactional public Long registerUser(User user) { // execute some SQL that e.g. // inserts the user into the db and retrieves the autogenerated id // userDao.save(user); return id; } } - Transaction Template
- PlatformTransactionManager를 사용하여 트랜잭션을 시작, 커밋, 롤백할 수 있다.
- 어노테이션을 통한 트랜잭션과는 달리, 프로그래밍 방식으로 관리할 수 있다는 장점이 있다.
public class PaymentService {
private PlatformTransactionManager transactionManager;
public void setTransactionManager(PlatformTransactionManager transactionManager){
this.transactionManager = transactionManager;
}
public void transactionCode() throws Exception {
TransactionStatus status = this.transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// execute some SQL statements...
this.transactionManager.commit(status);
} catch (RuntimeException e) {
this.transactionManager.rollback(status);
throw e;
}
}
}
📌 스프링 트랜잭션 고립이란 무엇인가요?
트랜잭션 고립 : 여러 트랜잭션끼리의 공유되는 데이터의 처리 방법을 제어하는 것을 의미한다.
스프링에서는 @Transactional 옵션으로 해당 고립 레벨을 설정할 수 있다.
@Service
public class MyService {
@Transactional(isolation = Isolation.READ_COMMITTED)
public void performSomeBusinessLogic() {
// 트랜잭션 경계 내에서 비즈니스 로직 수행
}
}
Isolation.READ_UNCOMMITTED: 다른 트랜잭션이 아직 커밋하지 않은 변경사항을 읽을 수 있다. 이로 인해 dirty read현상이 발생할 수 있다.
Isolation.READ_COMMITTED: 다른 트랜잭션에서 커밋한 데이터만 읽을 수 있다. non-repeatable read가 발생할 수 있다.
Isolation.REPEATABLE_READ: 동일한 쿼리를 실행했을 때 결과가 항상 일관되도록 보장한다. 다른 트랜잭션에서 쓰기 작업이 일어나도 읽기 작업은 블록된다.
Isolation.SERIALIZABLE: 가장 높은 고립 수준으로, 동시에 여러 트랜잭션이 실행될 때, 서로 간섭하지 않도록 보장한다. 모든 읽기와 쓰기 작업이 직렬화되어 처리된다.
📌 스프링 mvc의 런타임 flow는 무엇인가요?

- 어플리케이션이 실행되면 Tomcat에 의해 web.xml이 로딩
- web.xml에 등록되어 있는 ContextLoaderListener 생성
- 생성된 ContextLoaderListener는 root-context.xml을 로딩
- root-content.xml에 등록되어 있는 SpringContainer 구동
- 클라이언트로부터 웹 어플리케이션 요청이 옴
- DispatcherServlet이 생성됨
- DispatcherServlet은 servlet-content.xml을 Loading
📌 스프링 mvc 컴포넌트는 무엇이 있나요?

- DispatcherServlet: 모든요 청을 최초로 받아들이는 Servlet
- HandlerMapping: 클라이언트의 요청을 처리할 Controller를 찾는 작업
- Controller: Client의 요청을 처리
- ModelAndView: View에게 값을 전달하기 위해 사용되는 객체
- ViewResolver: View를 찾는 작업을 처리
- View: 화면구성
📌 @RequestMapping은 어떤 역할을 하나요?
특정 uri로 요청을 보내면 Controller에서 어떻게 처리할 것인지 정의를 한다. 이 때 요청이 컨트롤러의 메서드와 연결되게 하려면 @RequestMapping이 필요하다. 주로 value와 method를 사용하여 요청과 매핑한다. value는 uri와 매핑되고, method는 http요청방식과 매핑되어 설정 할 수 있다.
@RequestMapping(value = "/hello", method = RequestMethod.GET)
📌 @Autowired의 기능은 무엇인가요?
@Autowired는 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, 의존관계를 도와주는 어노테이션이다. 스프링 컨테이너에 빈들을 모두 등록한 후에, 의존성 주입 단계가 이루어진다.
'Java' 카테고리의 다른 글
| 👶주니어 자바 개발자를 위한 100가지 질문 - java Web, 예외클래스 (1) | 2023.09.11 |
|---|---|
| 👶주니어 자바 개발자를 위한 100가지 질문 - Reflection, Object Copy (0) | 2023.09.04 |
| 👶주니어 자바 개발자를 위한 100가지 질문-Container, Multi-Threading (1) | 2023.08.30 |
| 👶주니어 자바 개발자를 위한 100가지 질문-기초 (0) | 2023.07.17 |
| 자바 코드 컨벤션 (2) (0) | 2023.06.30 |
소중한 공감 감사합니다