잡다한 프로그래밍 :: 잡다한 프로그래밍
반응형

1. 사전준비

#1) Nodejs 설치하기

https://nodejs.org/ko/에서 LTS버전을 다운받아 설치한다.

 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

#2) yarn 설치하기

다음과 같이 yarn을 설치한다.

npm install --global yarn

 

#3) react app 생성하기

다음과 같이 리엑트 앱을 생성한다.

npx create-react-app 이름

2. 앱 실행하기

cd를 이용하여 폴더를 이동 후 다음과 같이 프로젝트를 실행한다.

yarn start

 

#1) 결과

다음과 같은 결과를 확인할 수 있다.

 

#2) App.js 수정

app.js 의 <p> 태그를 수정하고 저장하면 자동으로 compile되고 자동으로 페이지가 수정된다.

 

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> 안녕
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;


3. 결론

create react-app를 사용하게 되면 다른 server와 함께 사용할 때 처럼 webpack같은 부분이 모두 이미 포함되어있다.

반응형
반응형

1. 사전 준비

- pom.xml 수정

다음과 같은 내용을 pom.xml에 추가합니다 1. mybatis (버전은 스프링 버전에 맞게 선택 가능) 2. mybatis-spring

3.dbcp2, 4. mysql-connector 5. spring-jdbc

		<!-- MySQL -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.3</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.3</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.7.0</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

- jdbc.properties생성

WEB-INF에 properties폴더 생성 > 다음과 같은 jdbc.properties 파일 생성

jdbc.username = user_id
jdbc.password = password
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://URL/DB_NAME?serverTimezone=Asia/Seoul&useSSL=false

 

- mysql 연동

다음과 같이 root-context.xml에 추가한다 

	<!-- MySQL dataSource -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
    
	<!-- jdbc.properties를 찾게 해주는 placeholder -->    
 	<context:property-placeholder location="/WEB-INF/properties/jdbc.properties" />

2. mybatis 연동 및 사용

- TestModel 생성

DB로부터 받아온 데이터를 담을 Model 클래스를 생성한다

@Getter
@Setter
public class Test_Model {

	private String date;

	private int count;

}

 

- mybatis-config.xml 생성

main/resources에 다음과 같은 mybatis-config.xml을 생성한다. 등록된 모델을 test라는 별칭으로 사용할 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="test.main.model.Test_Model" alias="test" />
	</typeAliases>

</configuration>

 

- rmcMapper.xml 생성

main/resource에 mappers라는 패키지를 만들고 패키지 내에 다음과 같은 testMapper.xml을 생성한다.

resultType를 config.xml에 지정한 test타입으로 반환하고 사용할 쿼리의 id를 getData로 지정한다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="test.main.mapper.testMapper">
	<select id="getData" resultType="test">
		select * FROM test_db
	</select>
</mapper>

 

- root-config.xml 수정

다음과 같이 root-config.xml에 mybatis를 설정하기 위한 위한 코드를 추가한다. mybatis-config.xml과 Mapper.xml을 bean으로 등록하고 sqlsession을 bean으로 등록한다.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:/mybatis-config.xml" />
		<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
	</bean>
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
	</bean>
	

3. Controller, Service, DAO 만들기

- Controller 생성

다음과 같은 Controller를 작성한다. 간단하게 getData를 해오는 코드이다.

@Controller
@RequestMapping(value = "/brokenSVC")
public class testController {
	@Autowired
	private BrokenService testService;
	
	@GetMapping(value = "test")
	public String home(Model model) {
		System.out.println(testService.getdata().get(0).getDate());
		return "testpage";
	}
}

 

- Service 생성

다음과 같은 Service를 작성한다.

@Service
public class BrokenService {

	@Autowired
	private testDAO testdao;

	public List<Test_Model> getData() {
		return testdao.getData();
	}
}

 

- DAO 생성

다음과 같은 DAO를 작성한다.

@Repository
public class BrokenDAO {
	
	@Autowired private SqlSession sqlSession;
	private static final String Namespace = "test.main.mapper.rmcMapper"; //rmcMapper가 있는 위치
	
	public List<Test_Model> getData() {
		return sqlSession.selectList(Namespace+".getData");
	}
}

4. 결론

mybatis를 사용할 경우 기존 방법은 DAO에 쿼리문이 섞여있다는 단점이 있었는데 쿼리를 완벽하게 분리하여 사용할 수 있다는 장점이 있다.

반응형
반응형

0. 개요

https://diqmwl-programming.tistory.com/63

 

[Spring boot 강의] #2 스프링부트 HTTPS / HTTP2적용하기

1. HTTPS란 HTTP는 인터넷에서 웹 서버와 사용자 브라우저간 문서를 전송하기 위한 통신 규약이다. HTTP는 정보를 텍스트로 주고받기 때문에 누군가가 네트워크 이를 가로챈다면 정보를 확인할 수 있어서 보안에..

diqmwl-programming.tistory.com

https를 적용하기 위해 ingress에 tls를 적용하는 방법을 공부한다

https와 http의차이가 궁금하다면 다음 강의를 참고한다

1. 인증서 발급받기

letsencrypt를 통해 무료 인증서를 발급받는다. (발급받는 법 수정 예정)


2. secret 생성하기

다음과 같은 명령어를 통해 tls secret을 생성한다. 이때 secret과 ingress 컨트롤러가 같은 네임스페이스에 위치하도록 한다

Kubectl create secret tls {secretname} --key {private.pem경로} --cert {fullchain.pem경로}

ex)
Kubectl create secret tls nginx-tls --key private.pem --cert fullchain.pem -n ingress-nginx

3. ingress 생성하기

다음과 같이 Ingress를 생성한다

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: service-loadbalancing
  namespace: ingress-nginx
spec:
  rules:
  - http:
      paths:
        - path: /one
          backend:
            serviceName: service-1
            servicePort: 9000
        - path: /two
          backend:
            serviceName: service-2
            servicePort: 9001
  tls:
  - secretName: nginx-tls

4. ingress 적용하기

다음과 같이 kubernetes에 적용한다

kubectl apply -f ingress.yml
반응형
반응형

 

https://www.acmicpc.net/problem/1068

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.

www.acmicpc.net

1. 해결방법

열 단위로 램프가 켜지기 때문에 같은 패턴을 띄어야만 행의 램프가 켜질 수 있다 따라서 1행이 0 1 이라면 나머지 2 3행에서 0 1 패턴이 있는지 찾고 이를 반복적으로 수행하면 된다. 또한 0의 개수가 K보다작은지, K%2 = 0%2인지 비교해주면 된다


2. 코드

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

int N, M, K;
string ary[51];
int max_value = 0;

int main()
{
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		cin >> ary[i];
	}
	cin >> K;
	
		for (int j = 0; j < N; j++) {
			int zero_cnt = 0;
			for (int k = 0; k < M; k++) {
				if (ary[j][k] == '0') {
					zero_cnt++;
				}
			}
			int cnt = 0;
			if (zero_cnt <= K && zero_cnt % 2 == K % 2) {
				for (int m = 0; m < N; m++) {
					if (ary[j] == ary[m]) {
						cnt++;
					}
				}
			}
			max_value = max(max_value, cnt);
		}
		cout << max_value;
}
반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] #1197 램프  (0) 2020.05.08
[백준] #1012 유기농 배추  (0) 2020.04.06
[백준] #1068 트리  (0) 2020.03.29
반응형

 

https://www.acmicpc.net/problem/1068

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.

www.acmicpc.net

1. 해결방법

N, M의 최대수가 적으므로 DFS를 통해 해결하였다.


2. 코드

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;

int test_case;
int M,N,K;
int ary[51][51];
int chk[51][51];
int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { -1, 1, 0, 0 };
int result = 0;

void dfs(int x, int y) {
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx < 0 || nx >= M || ny < 0 || ny >= N || chk[nx][ny] || ary[nx][ny] == 0) continue;
		else {
			chk[nx][ny] = 1;
			dfs(nx, ny);
		}
	}
}

int main()
{
	cin >> test_case;
	for (int i = 0; i < test_case; i++) {
		cin >> M;
		cin >> N;
		cin >> K;
		memset(ary, 0, sizeof(ary));
		memset(chk, 0, sizeof(chk));
		result = 0;
		for (int j = 0; j < K; j++) {
			int x, y;
			cin >> x >> y;
			ary[x][y] = 1;
		}

		for (int i = 0; i < M; i++) {
			for (int j = 0; j < N; j++) {
				if (ary[i][j] == 1 && chk[i][j] == 0) {
					chk[i][j] = 1;
					dfs(i, j);
					result++;
				}
			}
		}
		cout << result << endl;
	}

}

 

 

반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] #1197 램프  (0) 2020.05.08
[백준] #1034 램프  (0) 2020.04.13
[백준] #1068 트리  (0) 2020.03.29
반응형

https://www.acmicpc.net/problem/1068

 

1068번: 트리

첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.

www.acmicpc.net

1. 해결방법

BFS를 통하여 해결하였고, 트리를 Vector에 저장하는 방법을 몰라서 찾아보았다


2. 코드

트리문제 유형을 공부해보지 못해서 고생했다. 특히 비교하는 부분 코드가 수정할 수 있을거 같으므로 나중에 다시 풀어볼 예정이다

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int N;
int M;
int D;
int root;
int result = 0;
queue<int> q;
vector<int> t[51];

void BFS() {
    if (root == D) return;
    q.push(root);
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        for (int i = 0; i < t[node].size(); i++) {
            if (t[node][i] != D) {
                q.push(t[node][i]);
                if (!t[t[node][i]].size() || (t[t[node][i]].size() == 1 &&t[t[node][i]][0] == D)){
                    result++;
                }
            }
            else {
                if (root == node && t[node].size() <=1) result++;
            }
        }
    }
}

int main()
{
    cin >> N;

    for (int i = 0; i < N; i++) {
        cin >> M;
        if (M == -1) root = i;
        else t[M].push_back(i);
    }
    cin >> D;
    BFS();
    cout << result;
    return 0;
}
반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] #1197 램프  (0) 2020.05.08
[백준] #1034 램프  (0) 2020.04.13
[백준] #1012 유기농 배추  (0) 2020.04.06
반응형

0. 사전 준비

Ubuntu 환경에서 설치를 진행하였습니다.


1. Open JDK 설치하기

Jenkins를 이용하기 위해 Open JDK를 설치합니다.

$ sudo apt install openjdk-8-jdk

2. Jenkins 설치하기

다음과 같이 저장소를 추가한 후 Jenkins를 설치한다 (Docker를 이용하여 젠킨스를 설치하는 방법도 있지만 여기서는 직접 로컬에 설치한다)

$ sudo wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

$ sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'

$ sudo apt update

$ sudo apt install jenkins

젠킨스의 기본 포트는 8080이다 이 포트를 변경하여 사용하고 싶다면 다음 vi에디터에서

HTTP_PORT=8080 > HTTP_PORT= 원하는 포트번호로 수정

$ sudo vi /etc/default/jenkins

3. Jenkins 실행 & 정지 & 재시작

다음과 같이 Jenkins 서비스를 실행 정지 재시작할 수 있다. start 해주도록 하자

$ sudo service jenkins start

$ sudo service jenkins stop

$ sudo service jenkins restart

4. Jenkins 설정

#1) Password 입력

http://localhost:8080로 접속하면 다음과 같은 화면이 나온다 아래와 같은 명령어를 입력하고 나온 값을 password에 입력한다.

cat /var/lib/jenkins/secrets/initialAdminPassword

 

#2) 기본 설치

다음과 같이 기본 설정을 선택하여 설치한다

 

#3) 관리자 계정 만들기

빈칸을 입력하여 관리자 계정을 만든다 여러 개 추가하려면 Continue를 마치려면 Save를 선택한다

 

4) 도메인 URL 설정

가지고 있는 도메인이 있다면 입력하여 사용한다

 

5) 실행

다음과 같은 실행화면을 볼 수 있다.

반응형
반응형

1. 디플로이먼트의 업데이트 방법 4가지

  • ReCreate
  • Rolling Update
  • Blue/Green
  • Canary

#1) ReCreate

Pod1이 작동 중이라면 Pod1을 죽이고 Pod2를 실행시켜 업데이트하는 방식. Pod1이 죽고 Pod2가 실행되는 시간(Downtime)만큼의 빈 공간이 생긴다

 

#2) Rolling Update

Pod1이 1개 실행중이라면 Pod1이 실행된 상태로 Pod2를 실행한다 총 2개를 사용하는 셈 (이때 누군가는 Pod1에, Pod2에 접근할 수 있는 상태) 이후 Pod1을 삭제(이제부터 Pod2에만 접근함) 추가적인 자원을 요구하지만 Downtime이 없음

 

#3) Blue/Green

서비스와 연결된 pod1(컨트롤러1)이 실행 중일 때 pod2(컨트롤러 2)를 만듦 이후 서비스에 연결된 pod1을 pod2로 바꿔주면 pod2로 바꿀 수 있음(추가적인 자원을 요구하고, 서비스의 downtime 없음) 만약 pod2에 문제가 생기면 서비스에 연결된 pod만 pod1으로 바꿔주면 됨 문제가 없으면 pod1과 컨트롤러 1을 삭제해주면 됨

 

#4) Canary

업데이트 예정


2. Rolling Update 실습

다음과 같은 구조로 이루어져있을때 Deployment의 pod v1을 v2로 수정하면 자동으로 Rolling Update가 된다(Rolling Update가 Default)

 

Deployment.YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type: app
    spec:
      containers:
      - name: pod-test
        image: diqmwl/pod:v1
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: test-service
spec:
  selector:
    type: app
  ports:
    - port: 9000
      targetPort: 8080

다음과 같은 YAML에서 image: diqmwl/pod:v1 부분을 pod:v2로 수정하면 Rolling Update가 이루어진다.

반응형

+ Recent posts