본문 바로가기

Backend/spring

(11)
멀티쓰레드, HTTP API/CSR/SSR 쓰레드 HTTP에서 서블릿 객체를 누가 호출하지? 쓰레드 코드를 순차적으로 실행하는 것이 쓰레드이다. 동시처리가 필요하면 쓰레드를 추가해야 한다. 요청이 들어올 때마다 쓰레드를 생성해서 서비스를 처리한다. 쓰레드 풀 이러한 단점들을 극복하고자 쓰레드 풀을 생성한다. 미리 풀 안에 쓰레드를 생성해놓고 요청이 올때마다 풀에서 꺼내서 처리한다. 응답 이후 죽이지 말고 다시 풀에 반납한다. 쓰레드 풀이 비어있는 경우 대기 시키거나 거절할 수 있다. 톰캣 서버는 기본적으로 200개의 쓰레드를 사용해서 관리한다. WAS의 멀티 쓰레드 지원 WAS가 멀티 쓰레드 지원을 해준다! 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다. 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편하게 해도 된다. 싱글톤 객체는 주..
WEB/WAS, Servlet WEB/WAS Web Server 웹에서 대부분의 데이터는 HTTP 기반으로 동작한다. 정적HTML, CSS, JS, Image, Video 등등을 전송한다. NGINX, APACHE로 대표된다. WAS HTTP 기반 동작 웹서버 + a 웹 서버는 정적 리소스만 제공하지만, WAS는 동적으로 어플리케이션 로직을 수행할 수 있다. 동적 HTML, HTTP API(JSON)제공 가능 서블릿, JSP, Spring MVC전달 가능 Tomcat등 차이는? 웹서버는 정적 리소스, WAS는 어플리케이션 로직이다. 차이가 다소 모호한 점도 있다. 보통 자바에서 서블릿 컨테이너 기능을 제공하면 WAS라고 한다. WAS는 어플리케이션 코드를 실행하는데 더욱 특화되어 있다. 웹 시스템의 기본 구성 - WAS, DB was..
빈 라이프사이클, AOP Bean Lifecycle 스프링 컨테이너는 초기화와 종료라는 라이프사이클을 갖는다. // 컨테이너 초기화 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class) = new AnnotationConfigApplicationContext(Appcontext.class); // 컨테이너에서 빈 객체를 구해서 사용 Greeter g = ctx.getBean("greeter", Greeter.class); String msg = g.greet("스프링"); System.out.println(msg); // 컨테이너 종료 ctx.close(); 위 코드를 보면 AnnotationConfigApp..
의존 자동 주입과 컴포넌트 스캔 의존 자동 주입 앞서 스프링의 DI 설정에 대해 살펴봤다. 설정 클래스는 다음과 같이 주입할 의존 대상을 생성자나 메서드를 이용해서 주입했다. 이 코드는 의존 대상을 설정 코드에서 직접 주입한다. 의존 대상을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입해주는 기능도 있다. 이를 자동 주입이라고 한다. 스프링 부트의 부상과 더불어 자동 주입 방식이 더욱 자주 쓰이게 되었다. => 설정코드에서 생성자 혹은 세터 메서드를 호출해 명시적으로 의존 설정을 해주어야 했다. 자동 주입을 하게되면 이러한 명시적 설정을 생략할 수 있다. @Autowired 어노테이션을 이용한 의존 자동 주입 스프링에서 의존 자동 주입을 설정하는 방법에는 여러가지가 있지만 주로 @Autowired 어노테이..
Spring DI DI는 Dependency Injection의 약자로 '의존 주입'이라고 번역할 수 있다. 여기에서 의존이란 객체 간의 의존을 의미하고, 한 클래스가 다른 클래스의 메서드를 실행할 때 이를 '의존'한다고 표현한다. 의존하는 방법에는 여러가지가 있다. 가장 쉬운 방법은 의존 대상 객체를 직접 생성하는 것이다. 클래스의 필드에 대상 클래스 생성자를 통해 객체를 직접 생성한 뒤 사용할 수 있다. 하지만 Spring에서의 DI는 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식을 사용한다. 객체 조립기 DI를 사용하는 이유는 코드 변경에 유연하게 대처하기 위해서이다. 변경된 코드를 주입하는 경우 객체를 주입하는 코드 한 곳만 변경하면 된다. 그렇다면 객체를 생성하는 코드는 어디에 두어야 할까? 한 ..
Spring ApplicationContext, IoC, Singleton 스프링은 객체 컨테이너 package chap02; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class); Greeter g1 = ctx.getBean("greeter", Greeter.class); Greeter g2 = ctx.getBean("greeter", Greeter.class); System.out.println("(g1..
스프링 빈과 의존관계 컴포넌트 스캔과 자동 의존관계 설정 서비스: 멤버 가입 비즈니스 로직 리포지토리: 데이터베이스, 저장, 불러오기 컨트롤러: 외부 요청을 받는다 컨트롤러가 서비스를 통해서 처리한다. 이를 컨트롤러가 서비스를 의존한다고 한다. 각 요소들(서비스, 컨트롤러, 리포지토리)들은 스프링 컨테이너에서 스프링 빈으로 관리된다. 멤버 컨트롤러에서만 멤버 서비스를 가져다 쓸 수 있어야 한다. 지금은 리포지토리가 new로 생성되어 다른 컨트롤러에서도 사용이 가능하다. 때문에 컨트롤러에서만 사용할 수 있도록 제한해야 한다.(의존성을 가져야 한다. 또한 하나의 인스턴스만 필요하다) =>의존관계를 설정해야 한다. 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴..
스프링 회원 관리 예제 - 백엔드 개발 비즈니스 요구사항 정리 데이터: 회원ID, 이름 기능: 회원 등록, 조회 컨트롤러: 웹 MVC의 컨트롤러 서비스: 핵심 비즈니스 로직 도메인: 비즈니스 도메인 객체 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 리포지토리는 아직 db가 선정되지 않았으므로 interface로 만든다. 나중에 구현 클래스로 변경이 가능하다. 초기 개발 단계에 구현체로 가벼운 메모리 기반의 데이터 저장소를 사용한다. 회원 도메인과 리포지토리 만들기 도메인: 데이터의 형태를 설계한다. getter, setter함수를 포함한다. /domain/Memeber.java 리포지토리: Optional: Java8에 추가되었다. 검색 결과로 나온 null을 처리하는 방법 중 하나가 된다. 회원 리포지토리 테스트 케..