본문 바로가기

전체 글88

스프링 DB 1편 - 1 1. JDBC의 이해 먼 과거의 DB 접근법은 두 가지 문제가 있었다. 1. 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버에 개발된 데이터베이스 사용 코드도 함께 변경해야 한다. 2. 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 응답 받는 방법을 새로 학습해야 한다. 그래서 JDBC(Java Database Connectivity)(1997)가 등장했다. 대표적으로 3가지 기능을 표준 인터페이스로 제공한다. java.sql.Connecition java.sql.Statement java.sql.ResultSet 이렇게 만들어진 인터페이스를 각각의 벤더에서 구현해서 라이브러리로 제공한다. JDBC의 등장으로 공통적인 부분들에 대해선 편해졌지만 각각의 데이터베이스마다 S.. 2022. 11. 2.
docker - 멀티 컨테이너 어플리케이션 지난번 포스팅에서 두 가지의 컨테이너를 띄우고 둘 사이의 네트워킹 방법에 대해 알아봤는다. 보통 도커는 각각의 어플리케이션마다 컨테이너를 띄우는 다중 컨테이너로 구성한다. 그게 도커에서 권장하는 방법이다. 개발 환경에서 해당 요구사항을 반영해서 어플리케이션을 각각 컨테이너화 해보자 주의해야 할 점 1. 몽고DB의 데이터는 항상 볼륨에 저장되어야 하며 2. 접근은 ID와 비밀번호를 통해 접속할 수 있어야 한다. 백엔드 어플리케이션은 1. 데이터가 항상 유지되어야 하며 2. 개발 환경을 가정했으므로 코드 변동이 자동 적용되어야 한다. 프론트 어플리케이션은 1. 코드 변동이 자동으로 적용돼야 한다. 1. 몽고DB docker run --name mongodb --rm -d -p 27017:27017 mongo.. 2022. 10. 30.
docker - 네트워킹 컨테이너에서의 네트워킹에 대해 생각해보면 세 가지로 나눠 볼 수 있다. 1. 컨테이너와 외부 URL과의 통신 2. 호스트 머신과의 통신 3. 가상화된 DB 등과의 컨테이너간 통신 1. 컨테이너와 외부 URL과의 통신 첫번째는 당연하게도 그냥 url이나 ip주소 갖다 넣으면 된다. 2. 호스트 머신과의 통신 mongoose.connect( 'mongodb://localhost:27017/swfavorites', { useNewUrlParser: true }, (err) => { if (err) { console.log(err); } else { app.listen(3000); } } ); 코드에 위와 같은 부분이 있고 호스트 머신에 몽고 DB가 설치되어 있는 상황을 가정했을 때 위의 코드를 다른 node .. 2022. 10. 19.
docker - 데이터 관리(볼륨), .dockerignore, 환경변수, 매개변수 1. 익명볼륨과 명명된 볼륨 이미지가 빌드되면 내부의 코드는 변경될 수 없다. 모든 명령이 실행되면 이미지는 읽기 전용이기 때문에 무언가를 변경하려면 리빌드 해야한다. 컨테이너에서 데이터는 세가지 종류로 분류할 수 있다. 하나는 어플리케이션 데이터, 두번째는 임시 데이터, 마지막은 영구 데이터 어플리케이션 데이터는 우리가 만든 웹 어플리케이션이라고 할 수 있고 이미지에 의해 변경될 수 없다. 임시 데이터는 로그와 같은 데이터로 read와 write를 할 수 있지만 컨테이너 안에 저장된다. 마지막으로 영구 데이터는 DB에 저장되는 정보 같은것을 의미하며 볼륨이라는 곳에 저장된다. 데이터 구조는 다음과 같이 생각하면 된다. 파일을 생성하는 어플리케이션을 실행시켜서 실행버튼을 누르면 로컬 머신에는 뜨지 않고 .. 2022. 10. 6.
docker - 기본 명령어 기본명령어 docker ps 실행 중인 모든 컨테이너를 디폴트로 보여준다. docker ps -a 더이상 실행되지 않는 중지된 컨테이너를 포함해 과거에 있었던 모든 컨테이너가 표시된다. 참고로 ps는 process status라고 한다. docker ps --help docker ps에 사용 가능한 모든 구성 옵션이 표시된다. docker run을 이용하면 현재 이미지를 기반으로 컨테이너를 시작한다. 하지만 항상 새로운 이미지로 시작할 필요는 없다. 이미지가 변경되지 않은 경우 기존 컨테이너를 시작하면 되는데 바로 위에서 봤던 docker ps -a을 통해 히스토리를 보고 다시 실행할 컨테이너를 고른다. 여기서 docker start peaceful_kalam 를 입력하면 기존의 컨테이너를 재시작 할 수.. 2022. 10. 4.
docker - introduction docker란? docker는 컨테이너의 생성 및 관리 프로세스를 단순화하는 도구이다. 도커를 가장 최근에 프로젝트를 실행하는데 사용했는데 제공자분이 다음과 같은 docker-compose.yml 파일을 만들어서 주셨고 나는 로컬에서 docker run을 통해 동일한 mysql 환경을 구축해 코드로 구현된 직접 JDBC 접속을 해야하는 실습을 예외 없이 진행할 수 있었다. version: "3.9" services: db: image: mysql:8.0.30 platform: linux/x86_64 restart: always ports: - "3308:3306" environment: MYSQL_ROOT_PASSWORD: mypass1 MYSQL_DATABASE: springbook MYSQL_USER.. 2022. 9. 8.
where절 외의 서브쿼리 인자 where절 외의 select, from 절 서브쿼리에 대해 알아보자 1. select 절 서브쿼리 select문은 스칼라 서브쿼리만 가능하다. select절의 역할에 대해 생각해보면 당연하다. 상품 라인별 평균 소비자가격을 검색해보면 select productLine, name, MSRP 소비자가격, ( select ROUND(AVG(MSRP), 2) from products Y where Y.productLine = X.productLine ) '상품라인별 평균 소비자가격' from products X order by 1; select city 지점, ( select count(*) from employees Y where Y.officeCode = X.officeCode ) 직원수 from o.. 2022. 8. 31.
where절 서브쿼리 서브쿼리 란 SQL 안에 포함되는 SELECT 문으로 검색문의 where절, select절 (scalar subquery), from절(inline view), having절, order by절 에서 사용 가능하고 갱신문의 insert문의 values절, update문의 set절 등에서 사용 가능하다. 경험상 where절, select절의 스칼라 서브쿼리, from 등에 많이 사용했던 것 같다. 주의사항 1. 컬럼 참조의 제한 - 일반적으로 서브쿼리는 메인 쿼리 컬럼을 참조 가능하지만 메인쿼리는 서브쿼리의 컬럼을 참조할 수 없다. - from절 서브쿼리(inline view)의 경우 당연하게도 메인쿼리에서 서브쿼리를 자유롭게 참조할 수 있다. 2. order by절 사용의 제한 - where절 서브쿼리에.. 2022. 8. 24.
MySQL MySQL의 데이터 타입은 1. Numeric(숫자형) 2. Character(문자형) 3. Binary String(이진 문자형) - 사진 등을 담을 때 쓸 수 있다. 4. Temporal(날짜형) 1. Numeric 정수형 - TINYINT - 1byte 0~255 - SMALLINT - 2bytes 0~65,535 - MEDIUMINT - 3bytes 0~16,777,215 - INT -4bytes 0~4,294,967,295 - BIGINT - 8bytes 실수형 DECIMAL(p, s) DECIMAL(5, 2) -> -999.99 ~ 999.99 모든 컬럼의 기본값은 SIGNED이다. 2. Character 고정길이 문자열 CHAR(n) - 최대 255문자(2^8) 가변길이 문자열 VARCHAR.. 2022. 7. 4.
깃헙에 쓸려구요 vue 공부하면서 마크다운으로 공부하는걸 작성했는데 티스토리에 옮겨적으니까 태그들이 갑자기 적용돼서 여기에는 못 쓸것 같다. 그쪽 공부는 깃허브 book-review레포에 올리려고 한다. 2022. 4. 20.
mvc2 - 타입컨버터 쿼리 파라미터로 숫자를 보낸다고 생각하면 @GetMapping("/hello-v1") public String helloV1(HttpServletRequest request){ String data = request.getParameter("data"); Integer integer = Integer.valueOf(data);//숫자 타입으로 변경 System.out.println("integer = " + integer); return "ok"; } 다음과 같이 서블릿을 이용한 타입 변환을 해야했지만 @RequestParam으로 받아준다면 @GetMapping("/hello-v2") public String helloV2(@RequestParam Integer data){ System.out.print.. 2022. 3. 2.
API 예외 처리 지난 mvc2 필터, 인터셉터 포스팅 말미에 서블릿 컨테이너까지 예외가 올라갔다가 다시 실행되는 추가 프로세스를 ExceptionResolver를 직접 구현함으로써 나름 간단히 해줬지만 이제 스프링이 제공하는 ExceptionResolver를 사용해보려고 한다. API 예외 처리 - 스프링이 제공하는 ExceptionResolver1 스프링 부트가 기본으로 제공하는 ExceptionResolver는 다음과 같다. 아래 세 개는 기본적으로 ExceptionResolver에 등록되어 있다. 1. ExceptionHandlerExceptionResolver @ExceptionHander를 처리한다. API 예외 처리는 대부분 이 기능으로 해결한다. 2. ResponseStatusExceptionResolver.. 2022. 3. 1.