본문 바로가기

분류 전체보기

(106)
@ComponentScan의 탐색 위치와 대상 탐색 위치와 기본 스캔 대상 탐색할 패키지의 시작 위치 지정 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작 위치를 지정할 수 있다. @ComponentScan( basePackages = "hello.core", } basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다. 예를 들어 basePackages = "hello.core.member"라고 한다면 member 패키지를 포함한 하위 패키지들만 탐색한다. basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다. basePackageClasses = AutoApp..
@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 컨테이너이며, 요청마다 객체를 생성하는 것을 구현하여..
Chap 7_2. 프로세스 PCB(process Control Block) = 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보 다음의 구성 요소를 가진다 (구조체로 유지) (1) OS가 관리상 사용하는 정보 • Process state(프로세스 상태 = ready, blocked) , Process ID • scheduling information, priority(CPU 우선순위 값을 두어서 운영한다) pointer를 통해 여러 PCB들을 연결할 수 있다. (줄 서있는 모습을 구현) (2) CPU 수행 관련 하드웨어 값 • Program counter, registers 프로세스의 문맥을 파악하기 위함 (어떤 값이 프로세스에 있었는지) program counter는 현재 메모리에 어떤 부분을 수행하고 있는지 가리..
스프링 컨테이너와 스프링 빈 스프링 컨테이너란? : 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할 스프링 빈이란? : 자바 객체를 스프링에서는 빈(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 💚웹 서버와 웹 어플리케이션의 차이 “웹 서버는 정적 리소스(파일)을 제공해주는 것이고..
[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] EC2 서버에 프로젝트를 배포 8.1 EC2에 프로젝트 clone 받기 깃허브에서 코드를 받아올 수 있게 EC2에 깃을 설치한다. EC2로 접속해서 다음과 같이 깃 설치 명령어를 입력한다. sudo yum install git 깃이 성공적으로 설치되면 git clone으로 프로젝트를 저장할 디렉토리를 생성한다. mkdir ~/app && midir ~/app/step1 생성된 디렉토리로 이동한다. cd ~/app/step1 깃허브 웹페이지에서 http 주소를 복사한다. git clone [복사한 주소] git clone이 끝났으면 클론된 프로젝트로 이동해서 파일들이 잘 복사되었는지 확인 cd [프로젝트명] ll 코드들이 잘 수행되는지 테스트로 검증 ./gradlew test → 정상적 테스트 통과 만약 gradlew 실행 권한이 없다..