Spring의 Controller 클래스도 Spring Bean이고 Spring Bean은 기본적으로 싱글톤인데 어떻게 수많은 요청을 Thread-Safe하게 처리가 가능한지 궁금했다. 그런데 이 문제에 대한 답은 JAVA 메모리 구조를 공부했으면 금방 이해할 수 있을 것이다. @RestController public class UserController { @PostMapping("/users") public void save(User user) { ... } } 위 코드는 사용자의 정보를 저장하는 Controller의 save 메서드가 있다. 동시에 여러개의 요청이 들어오면 Tomcat은 내부적으로 다음과 같이 요청을 처리한다. 요청이 들어온 순서대로 Queue에 담는다. ThreadPool에 현재 ..
Spring으로 개발하면 @Controller, @Service, @Repository 등의 어노테이션으로 Bean을 생성할 수 있는데 그렇다면 Bean을 생성할 때 어떤 클래스를 Bean으로 생성해야하는 것 일까? 그건 바로 값들을 담는 클래스가 아니라 작업을 하는 클래스를 Bean으로 생성해야한다. 예를들어 유저의 정보를 담고 있는 User클래스가 있고 유저의 정보로 관련된 작업을 하는 UserController클래스가 있다고 할 때 UserController는 Bean으로 등록해야하고 User클래스는 Bean으로 등록하지 않는다. @RestController public class UserController { @PostMapping("/users") public void save(User user..
MongoDB Atlas MongoDB를 설계한 사람들이 만든 모든 것을 관리하는 클라우드 데이터베이스이며 AWS, Azure, GCP를 통해 배포에 관한 모든 것을 통합 관리해준다. 이번글에는 Windows 환경으로 설치하는법에 대해 정리한다. Linux나 Mac OS에서 설치하시는분들은 아래링크를 참고바란다. MongoDB install (Mac OS) MongoDB install (Linux) MongoDB install (Windows) MongoDB Atlas 접속 & 클러스터 생성 여기를 눌러 메인화면으로 이동후 Get started now 버튼을 클릭한다. 구글로그인 or 회원가입을 진행한다. 필자는 구글로그인으로 진행하니 구글로그인 버튼을 클릭한다. Build a Database를 클릭한다..
MongoDB에는 ObjectId 타입을 지원하는데 RDBMS에서 Primary Key와 같은 고유한 키를 의미한다. Collections에 데이터를 넣을때 ObjectId를 직접 넣어주지 않는 이상 자동으로 값이 부여되며 모든 Document 들은 각각의 ObjectId가 생긴다. 만약 ObjectId를 형식에 맞지않게 넣는다거나 중복된 값을 넣게될 경우 예외가 발생된다. ObjectId 위 사진은 MongoDB Client 툴인 Mongo Compass에서 Document를 조회한 사진이다. 위 사진을 보면 _id 라는 이름의 Field를 확인할 수 있는데 모든 Document의 식별자 값은 _id 라는 이름의 ObjectId 타입 Field가 생성된다. ObjectId의 구조는 밑의 사진에서 볼 수..
NoSQL NoSQL은 Not Only SQL이라는 의미인데 RDBMS가 갖고있는 특성뿐 아니라 다른 특성들을 부가적으로 지원한다는 것을 의미한다. NoSQL의 특징중 Schema-less 하다는 특징이 있는데 다음사진을 보자 위 그림처럼 Schema-less 하다는 특징을 가지고 있어서 데이터를 원하는 타입으로 자유롭게 넣을 수 있다. 그래서 불필요한 join을 최소화 시켜줍니다. NoSQL의 장점 불필요한 join의 최소화 Schema-less 구조로 설계비용 감소 분산처리 및 병렬처리 가능 이러한 NoSQL은 여러종류가 있지만 그중에 대표적으로 많이쓰이는게 Key-Value 구조인 Redis, Document 구조인 MongoDB가 있다. MongoDB MongoDB는 NoSQL의 특성을 지니고 있..
클라우드를 공부하게되면 면접에서 나올법한 질문인 Container와 VM에 대한 설명을 정리해보고자 한다. Container 애플리케이션 중심으로 설계가 되었으며 컨테이너는 별도의 OS나 드 라이버 없이 호스트를 공유하는 형태로 실행된다. VM이 서버를 여러대로 사용할 수 있게 해주었다면 컨테이너는 애플리케이션을 독립적으로 실행해주기 위해 가상 공간을 할당해준다. VM보다 작은단위이며 처리하는 일도 적기 때문에 보다 간단하고, 빠르고, 효율적으로 애플리케이션을 실행시킬 수 있다. 대표적인 컨테이너는 Docker가 있다. VM 컴퓨터 환경을 가상화하여 소프트웨어로 구현한 것이다. VM은 서버, 호스트, Hyper-v 위에 올라가고 OS, 드라이버, 메모리 등 컴퓨터 환경이 구성되기 위한 필요요소들을 갖춰진..
기존 Spring 애플리케이션 환경을 구축할 때 주로 XML파일을 기반으로 개발에 필요한 모든설정을 잡아줬다. 가령 Spring MVC로 개발환경을 구성할 때 servlet-context.xml과 root-context.xml에 세팅하는데 설정을 잘못해서 예외가 발생하면 디버깅이 힘들었고 구축하는데에도 많은시간이 걸렸다. 그리고 컨트롤러에서 View를 렌더링 하는게 아닌 JSON 데이터를 전달하려고 할 때 jackson 라이브러리를 디펜던시에 추가해줘야하고 프론트에서 텍스트데이터가 아닌 파일형식의 데이터를 받아줄 때도 Multipart 디펜던시도 추가해줘야 한다. 이처럼 개발할 때 필요한 디펜던시들을 개발자가 하나하나 직접 찾아가면서 Spring 프로젝트 버전에 호환되게 등록해줬어야 했고 이러한 개발자의..
저번장에 정리했던 Dockerfile에서 주로쓰이는 명령어 내용을 참고하여 Spring Boot 애플리케이션을 생성후 Docker 이미지로 빌드후 실행해보자 Spring Boot 애플리케이션 생성 환경은 JAVA 11, Spring Boot 2.5.5 버전이고 Web 의존성만 추가하자 포트번호를 8000으로하고 간단한 컨트롤러 클래스를 생성해보자. 근데 컨트롤러의 hello 메서드에는 docker-app 이라는 이름의 환경변수에 해당하는 값을 조회하는데 이따가 Docker 이미지를 빌드할 때 컨테이너 내부에 docker-app 이라는 환경변수를 추가해줄 것 이다. 그리고 포트번호 또한 빌드할 때 명령어로 추가해줄 것 이다. Dockerfile 작성 FROM openjdk:latest ARG port EX..
우리가 개발한 애플리케이션을 Docker image로 build하려면 "Dockerfile" 이라는 이름의 파일을 작성해주어야 하는데 이 Dockerfile에는 Docker 이미지로 build하기위해서 어떠한 명령어들을 수행해야하는지 명령어가 적힌 파일이다. 해당 명령어를 모두 처리하면 Docker 이미지로 build할 수 있다. 이제 주로 쓰이는 명령어들을 알아보자. FROM FROM 이미지명:태그명 어떤이미지를 사용할 것인지 이미지명과 태그명을 적는다. 보통 Dockerfile의 최상단에 위치하는 명령어이다. 이미지명과 태그명은 도커 헙 공식문서 에서 확인할 수 있다. 예를들어 openjdk 이미지의 최신버전을 사용하기 위해서는 FROM openjdk:latest 라고 적어주면 되고 터미널에서 실행할..
Docker 도커는 컨테이너 환경에서 독립적으로 애플리케이션을 실행할 수 있도록 컨테이너를 만들고 관리하게 해주는 컨테이너 도구입니다. 컨테이너는 하나의 운영체제 커널에서 다른 프로세스에 영향을 받지 않고 독립적으로 실행되는 프로세스를 의미합니다. Docker를 사용해야 하는 이유 예를들어 N개의 운영체제에 동일버전의 웹서버, WAS, JAVA, DB를 설치해야한다고 가정할 때 각 운영체제에 접근해서 설치를 해야하고 추후에 서버가 증설될 때도 그 서버에도 위에 설치했던것들을 해줘야하는 반복적인 작업을 해야만 했습니다. 하지만 Docker를 이용하게되면 명령어 단 몇줄로도 간편하게 서버를 구축할 수 있습니다. Docker의 장점 손쉽게 애플리케이션 환경구성을 할 수 있습니다. 운영체제 환경에 관계없이 독립..
JAVA 11이 설치된 환경에서 Maven을 설치할 때 JAVA 버전이 8로 내려가는 현상을 겪게되었다. 아래사진을 보자 JAVA 버전확인 현재 JAVA는 11이 설치되있다. 이제 Maven을 설치해보자. Maven 설치 Maven을 설치하니 3.0대 버전이 설치되었고 JAVA 버전도 8로 바뀌었다. Maven 설치할 때 JAVA 8 관련 디펜던시도 설치하는데 아마 이때 바뀐듯 모양이다. 다시 JAVA 11로 바꿔주자. alternative 명령어로 java 관련 심볼릭링크 생성된 걸 확인해보니 8과 11 두개가 생성되있고 현재 8버전으로 적용이 되있다. JAVA 11로 바꾸기 위해선 심볼릭링크에 해당하는 번호를 선택해서 위 처럼 적용해야한다. 그리고 다시 JAVA 버전을 확인해보니 11로 적용되었다. ..
이번에는 AWS EC2 인스턴스를 생성해보자. EC2에 대해 잘 모른다면 아래링크를 참조하자. https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html AWS 콘솔접속 AWS에 로그인하여 콘솔화면 검색창에 EC2를 검색해서 들어간다. AWS 인스턴스 생성 인스턴스 시작버튼을 눌러준다. Amazon Linux 2 AMI를 선택하자. 위화면에서는 건드릴 부분은 없으므로 하단에 '검토 및 시작' 버튼을 선택하자 여기서 봐야될 부분은 '보안그룹' 인데 인바운드 포트 규칙을 설정할 수 있다. '보안 그룹 편집' 버튼을 누르고 들어가면 위사진처럼 나오는데 인바운드 포트 규칙을 작성할 수 있다. 설정하면 위 사진처럼 인바운드 포트 규칙이 추가된 ..
IAM 이란 Identity and Access Management (IAM) 의 약자이며 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이며 IAM을 사용하여 리소스를 사용하도록 인증 및 권한부여가 된 대상(사용자)을 제어하는걸 의미한다. IAM 사용자를 생성하는 방식은 크게 두가지가 있는데 액세스 키 방식과 암호 방식 두가지가 있다. 액세스 키 방식은 AWS CLI나 SDK로 AWS 외부에서 AWS의 리소스들을 접근할 수 있도록 해주는 것이고 암호 방식은 AWS Management Console에 직접 로그인을 할 수 있도록 해주는 것이다. 이번글에서는 액세스 키 방식으로 IAM 사용자를 생성하는 방식과 AWS S3에 접근할 수 있게끔 Role을 부여하는 방법에 대해 알아보고자 한다..
이번장에는 S3 버킷을 생성하고 버킷내부에 객체를 생성해보자. AWS 콘솔접속 AWS에 로그인하여 콘솔화면 검색창에 S3를 검색해서 들어간다. AWS 버킷 생성하기 화면우측에 있는 버킷 만들기 버튼을 누르자 버킷이름을 입력하고 AWS 리전은 아시아 태평양 (서울)로 지정하자. 버킷이름에 대한 규칙은 여기에서 확인해보도록하자 일단 모든 사용자한테 액세스를 허용하기위해 모든퍼블릭 액세스 차단 체크박스를 해제하고 아래에있는 체크박스에 체크를 해두고 버킷만들기 버튼을 눌러 버킷을 생성하자 버킷내부에 있는 객체들의 버전을 관리하는건데 똑같은 객체가 생성될 경우 버전관리를 할지 말지 결정하는 것이다. 비활성화하면 기존객체를 덮어씌게되고 활성화하면 덮어씌워지지않고 동일한 객체가 여러개 생성이 되며 각 객체를 식별할 ..
Simple Storage Service는 AWS에서 제공하는 서비스중의 하나로 줄여서 S3라고도 부릅니다. S3는 인터넷 스토리지 서비스이며 웹상에서 원하는 데이터를 저장하고 액세스 할 수 있도록 제공합니다. S3는 주로 애플리케이션에서 이미지, 파일 등 정적 리소스들을 저장하고 조회하는데 쓰입니다. S3를 이용하는데에 있어 장점과 네가지 개념을 간단하게 소개합니다. 장점 데이터의 내구성이 뛰어나다. 필요할 때 데이터를 사용할 수 있으며 장애, 오류 등으로 데이터를 보호할 수 있다. 성능이 우수하며 쓰기 및 읽기작업에 용이하다. 퍼블릭 액세스 차단기능을 지원하여 무단 액세스를 방지할 수 있다. 애플리케이션 영역에서 특정 권한을 가진 사용자만이 데이터를 저장 및 액세스 할 수 있다. Buckets 버킷은..
Spring에서 제공하는 HandlerMethodArgumentResolver는 컨트롤러의 메서드에 조건에 맞는 파라미터 및 어노테이션이 정의되있다면 원하는 값을 주입해주는 인터페이스 입니다. 메서드 매개변수에 @RequestBody 어노테이션이 정의되었으면 HandlerMethodArgumentResolver의 구현체인 RequestResponseBodyMethodProcessor가 동작하여 request body에 있는 Json 포맷의 데이터를 Java 객체에 바인딩을 해줍니다. 세션을 이용하여 로그인 기능을 구현하게되면 로그인 시 입력된 값으로 DB에 사용자를 조회후 조회한 값을 세션에저장할 것 이고 사용자의 정보가 필요할 경우 HttpSession을 컨트로러 메서드 매개변수에 주입받아 사용자의 정..
Java에서 메서드를 호출할 때 인자를 넘기는 방법은 Call By Value와 Call By Reference두가지가 있다. Call By Value는 값에 의한 호출이며 메서드로 인자값을 넘길 때 그 값을 복사해서 넘긴다. 이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되도 호출한쪽에서 넘긴 값은 변경되지 않는다. Call By Reference는 참조에 의한 호출이며 메서드로 인자값을 넘길 때 해당 객체를 참조하는 주소를 넘겨준다. 이 방식으로 호출하면 호출한 메서드 내부에서 해당 값을 사용할 때 해당값에 데이터가 변경되면호출한쪽에서 넘긴 값도 변경된다. Call By Value main 메서드에서 정수형 데이터 10과 20이 저장된 변수 두개를 swap 메..