본문 바로가기

WEB

(22)
@ComponentScan과 @Autowired 스프링은 설정 정보가 없어도 1) 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 2) 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다. ✔️ 컴포넌트 스캔의 필요성 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열하는 방법이 있다. 하지만 등록해야 할 스프링 빈이 많아진다면 하나씩 다 입력하는 것은 한계가 있고 누락할 가능성도 있다. => 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. ✔️ 컴포넌트 스캔 방법 ✏️[ 1 ] 다음과 같이 설정 정보 클래스에 @ComponentScan 어노테이션을 붙이면 된다. @Configuration @Comp..
@Configuration의 싱글톤 보장 스프링을 배우면 "스프링이 ~하게 관리해준다."와 같이 뭘 알아서 해준다는 것을 많이 들어봤을 것이다. 필자는 '스프링이 알아서 다 해준다고?? 어떻게??' 라는 의문점이 있었다. 뭐 스카이캐슬에 김주영쌤 같은 느낌 하지만 @Configuration 을 배우면서 어떤 식으로 스프링이 관리해준다는 말의 의미를 깨닫게 되었다. 앞으로 이어질 @Configuration에 대한 내용을 통해 독자도 필자와 같은 깨달음을 이해할 수 있길.. @Configuration 을 적용한 AppConfig에는 놀라운 비밀이 있다. @Configuration 을 붙이면 바이트코드를 조작하는 CGLIB 기술을 사용해서 싱글톤을 보장한다. 사실 개발자가 AppConfig라는 설정 정보를 입력하더라도 @Configuration 을 ..
싱글톤 방식 주의점_무상태(stateless) 싱글톤 방식의 주의점!!(완전 중요) 싱글톤 패턴이든, 스프링 같은 싱글톤 컨테이너를 사용하든, 객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다. 💡 무상태(stateless)로 설계해야 한다! 특정 클라이언트에 의존적인 필드가 있으면 안된다. 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다! 가급적 읽기만 가능해야 한다.(가급적 수정하지 않도록 해야 한다) 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다. 스프링 빈의 필드에 공유 값을 설정하면 정말 큰 장애가 발생할 수 있다!!! [상태를 유지할 경우 발생..
싱글톤 패턴과 스프링 컨테이너 👍 웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생했다. 대부분의 스프링 애플리케이션은 웹 애플리케이션이다. (물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있다.) 웹 애플리케이션의 특성 중 하나는 '여러 고객이 동시에 요청을 한다'는 것이다. 만약 요청을 할 때마다 객체가 생성된다면 3명의 사람이 memberService에 대한 요청이 있을 때 객체 3개가 만들어진다.( 만약 요청이 1초에 5만개라면 객체가 5만 객체가 생성되어야 한다. 비효율적이다.) 전 포스팅에서 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때 마다 객체를 새로 생성한다. 아래의 코드는 순수한 DI 컨테이너이며, 요청마다 객체를 생성하는 것을 구현하여..
스프링 컨테이너와 스프링 빈 스프링 컨테이너란? : 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할 스프링 빈이란? : 자바 객체를 스프링에서는 빈(Bean)이라고 부름 컨테이너와 빈이라는 걸 계속 개념 정리는 해왔지만 확 와닿지 않는다. 컨테이너가 뭐지?.. 공사장 근처에 있는 회색 컨테이너가 생각난다.빈?? 원빈인가?ㅋㅋ 다음 스프링 컨테이너를 생성하는 과정을 통해 개념을 더 잘 이해해보도록 하자! ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 위의 코드는 스프링 컨테이너를 생성하는 코드인데 여기서 ApplicationContext 를 '스프링 컨테이너'라 한다...
AppConfig와 DI 스프링 어린이(스린이)로서 프로젝트를 할 때 괜찮은 코드를 참고 위해 구글링하면서 여기 저기 돌아다니다보면 "AppConfig" 이 녀석을 많이 보게 된다. 이전 뭐지? 뭐 설정해주는건가? 하고 넘겼다. 게다가 스린이 입장으로 봤을 때 '한 번의 선언으로 해결할 수 있는데 쓸데없이 코드가 한 번 더 있네? 빼야하는 부분 아닌가? 뭐 가독성은 있는데 빼는 게 더 나을듯 후훗 역시 나는 효율적이야' 라고 생각했다. (바보같은 생각) 하지만 알고보니 이 녀석은 아주 좋은 객체지향 코드가 되기 위한 핵심 역할을 해주는 좋은 녀석(마치 찐빵의 팥)이었다!! 비유적으로 접근하자면, 배역은 인터페이스이고 배우는 이를 구현하는 구현체라고 하자. 이때, AppConfig는 "공연 기획자, 캐스팅 담당자"로 배역에 맞는 ..
웹 애플리케이션의 이해 - WAS와 서블릿 ✔️웹서버 vs 웹 어플리케이션 서버 웹서버 HTTP 기반으로 동작 정적 리소스 제공, 기타 부가 기능 정적(파일) HTML, CSS, JS, 이미지, 영상 → 어떠한 파일에 대한 요청이 오면 그것을 그대로 제공함 예) NGINX, APACHE 웹 애플리케이션 서버 (WAS) HTTP 기반으로 동작 웹서버 기능 대부분 포함 + (정적 리소스 제공 가능) 웹서버와 다른 점은 “프로그램 코드를 실행해서 애플리케이션 로직 수행” 한다는 것 동적 HTML, HTTP API(JSON) 서블릿, JSP , 스프링 MVC 예를 들어 코드를 실행할 수 있기 때문에 각 사용자의 이름을 띄우는 것 예) 톰캣 Jetty, Undertow 💚웹 서버와 웹 어플리케이션의 차이 “웹 서버는 정적 리소스(파일)을 제공해주는 것이고..
객체 지향과 스프링(다형성과 SOLID) 이 글은 김영한님의 "스프링 핵심 원리 - 기본편"을 듣고 정리한 글입니다. (인프런) 이번에 프로젝트를 진행하면서 스프링의 장점 중 하나인 "재사용성" 부분을 고려하고 짜려고 했다. 하지만 적용하는 것은 역시 쉽지 않았다. 프로젝트 리팩토링할 때 스프링의 근본을 더 잘 알면 더 좋은 코드를 짤 수 있을 것이라고 생각이 들어 강의를 듣게 되었다. 역할과 구현을 분리 자바 언어의 다형성을 활용구현 : 인터페이스를 구현한 클래스, 구현 객체 역할 : 인터페이스 객체를 설계할 때 역할과 구현을 명확히 분리 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기 (즉, 구현보다 인터페이스가 먼저임, 역할이 더 중요하다) 클라이언트에 영향을 주지 않는 변경 가능 → 요청을 받는 쪽..
[🔐 스프링 시큐리티] 스프링 시큐리티 용어와 흐름 🔐 스프링 시큐리티란? Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크 스프링 시큐리티의 핵심 역할은 Authentication Manager(인증 매니저)를 통해서 이루어진다. Authentication Provider는 인증 매니저가 어떻게 동작해야 하는지 결정하고 최종적으로 실제 인증은 UserDetailsService에 의해서 이루어진다. 🔐 필터와 필터 체이닝 스프링 시큐리티에서 필터는 서블릿이나 JSP 에서 사용하는 필터와 같은 개념입니다만 스프링 시큐리티에서는 스프링의 빈과 연동할 수 있는 구조로 설계되어 있다. 일반적인 필터는 스프링의 빈을 사용할 수 없기 때문에 별도의 클래스를 상속받는 형태가 많다. 스프링 ..
[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] JPA_도메인 JPA 소개 패러다임 불일치 객체 지향 프로그램과 관계형 데이터 베이스의 “패러다임 불일치” 객체 지향 프로그래밍 = 메시지를 기반으로 기능과 속성을 한 곳에서 관리 관계형 데이터베이스 = 어떻게 데이터를 저장할지 객체 지향의 부모 관계 자식의 관계를 관계 데이터 베이스로 구현하기 없다. → 개발이 데이터 모델링에만 집중하게 된다는 단점 해결 방법 = JPA = 객체 중심으로 개발 가능 [ Spring Data JPA ] 개념 JPA = 인터페이스로서 자바 표준 명세서이다. 인터페이스인 JPA를 사용하기 위해서 구현체가 필요하다. (ex) Hibernate, Eclipse Link 하지만 스프링에서 JPA를 사용할 때 이 구현체들을 직접 다루지 않음 구현체를 좀 더 쉽게 사용하고자 추상화 시킴(= Spr..