import java.util.Arrays;
public class SieveOfEratosthenes {
public static void printNum(int[] nums, boolean[] checks) {
// check를 참고해서 true인 nums[i]만 출력, size 출력
int cnt = 0;
for (int i = 0; i < nums.length; i++) {
if(checks[i]){
System.out.print(nums[i] + " ");
cnt++;
}
}
System.out.println("\nsize:" + cnt);
}
public static void main(String[] args) {
int N = 50;
int[] nums = new int[N-1]; // 2~50까지 넣을 배열 생성
boolean[] checks = new boolean[nums.length];
Arrays.fill(checks, true); // checks를 true로 초기화
for (int i = 0; i < nums.length; i++) { // 2~50까지 채우기
nums[i] = i + 2;
}
// 배수를 false로 변환
for (int i = 0; i * i <= N; i++) {
int multipleOf = nums[i];
for (int j = multipleOf + i; j < nums.length; j+=multipleOf) {
checks[j] = false;
}
printNum(nums, checks);
}
}
}
🔴 위 코드처럼 구현한다면, nums 배열의 인덱스와 값이 다르기 때문에 헷갈릴 수 있음
👉 221102의 checks처럼 인덱스와 값을 동일하게 만든다면, 코드를 봤을때 조금 더 이해하기 편할 것 같음
컨테이너 기술
컨테이너 : 리눅스 + 어플리케이션
java어플리케이션을 Linux에 리눅스 서버에 띄우는 것

🔴 리눅스에서 바로 실행한 것, Docker를 안거친 것
👉 Docker : 아래 작업이 스크립트화가 되는 것임
kill -9 <pid>
git pull
mvn -DskipTests=true package
cd target
java -jar crud-api-0.0.1-SNAPSHOT.jar
🔴 발생한 에러
이미 포트가 사용중 : Docker 내린 후 다시 올리기(포트 중복)
docker ps : 컨테이너 확인
docker stop [해당 Id] : 컨테이너 중지 후
다시 java -jar crud-api-0.0.1-SNAPSHOT.jar
docker로 빌드를 해놓으면 docker만 설치되어 있으면 아무곳에서 다 뜸
즉, 우리가 개발한 어플리케이션을 컨테이너 형태로 만드는 것
-> Dockerfile 작성 + Environment Variable로 변수 넘기기
(-e : 변수 넘기기 (DB접속 정보, API의 인증정보)
image도 git처럼 글로벌하게 공유할 수 있음(docker.hub -> github)
docker.hub에 올린 예시
docker run gazgeek/springboot-helloworld
👉 infra의 소스코드화 -> 아주 쉽게 복제 가능
-e : 환경변수 설정
SPRING_DATASOURCE_URL를 host로 설정
docker run -i -t -e SPRING_DATASOURCE_URL=host ubuntu:22.04
👉 환경변수를 지정하면 기존에 있던 application.yml의 환경변수가 OS환경변수보다 우선순위가 낮기 때문에 OS환경변수로 덮어쓰기됨
환경 변수 설정 및 daemon으로 띄우기(-e, -d)
docker run -p 8081:8081 -d -e SPRING_DATASOURCE_URL=url -e SPRING_DATASOURCE_PASSWORD=password springboot-jdbc-template
docker ps : container_id 확인하기 위함
docker exec <container_id> printenv : 앞에서 -e옵션으로 정보가 잘 넘어갔는지 확인하기
컨테이너 삭제 != 이미지 삭제
➡ 컨테이너를 삭제해도 image는 지워지지 않음
docker rm <container_id> : 컨테이너 삭제 코드지만 지워지지 않을 경우가 있음docker kill <container_id> : 컨테이너 내리기docker ps : 올라간 컨테이너 확인docker ps -a : 모든 컨테이너 보기docker rm <container_id>docker rmi <image_name>:<version>
컨테이너가 돌고있다고 했을때 컨테이너를 내리고 시도해보고, 컨테이너를 지우고 시도해보자
🔸 앞의 포트 : 외부에서 들어오는 것(aws에 연결하고 싶은것, HTTP - 보안에서 열어줘야함)
🔸 뒤의 포트 : 들어온 다음에 docker로 가는 것(application.properities, .yml 설정값)
docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
🔸 --name 옵션을 이용해 name을 지정할 수 있다는 것
🔸 --link를 이용해 앞에서 --name을 지정해서 띄운 mysql과 연동한 것
NDS주소:포트 : 접속리눅스(호스트)와 Docker Container간에 같은 디렉토리를 바라보도록 하는 것
우리가 병원 데이터를 MySQL을 넣어도, Docker가 내려가면 데이터가 사라짐
-v : 호스트의 공유 디렉터리:컨테이너의 공유 디렉터리를 공유
docker run -d -v /root:/app ubuntu:22.04 : /root와 /app을 연결확인docker run -d -p 3308:3306 --name wordpressdb1 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /root/mysql_data:/var/lib/mysql mysql:5.7