오늘도 끄적끄적

느리더라도 꾸준하게

redirect를 위한 HTTP 상태 코드 301과 302에 대해 잘 모르겠다면 아래 링크를 참고하고 글을 읽도록 하자.
301리디렉션 & 302리디렉션의 차이(사용법)

307 Temporary Redirect vs 308 Permanent Redirect

307은 302와 유사하고, 308은 301과 유사하다.
다만 차이점이 있다면 전송 받은 HTTP Method를 유지한다는 것이다.
301과 302는 redirect 시킬 때 method를 get으로 바꿔서 전송한다.
따라서 get 요청을 보낼 때는 문제가 없지만 post 메소드를 요청했을 때 문제가 발생할 수 있다.
http to https redirect를 구현할 때 301 또는 302 상태 코드를 쓰게 되면
http 프로토콜을 통해 post 메소드로 날아온 게 https 프토토콜을 통해 get 메소드로 변경되면서 컨트롤러나 라우터에 매핑되는 URI가 없어서 오류가 나게 된다.
따라서 301 대신에 308을, 302 대신에 307을 쓰면 좀 더 안전하게 redirect 시킬 수 있다.
또한 이제 301과 302를 redirect라는 명칭으로 부를 수도 없다.
301은 Moved Permanently로, 302는 Found로 명칭이 변경되었다.

지금 당장 쓸 수 있나?

더 읽어보기 »

ELB가 요청 분산 및 오토 스케일링을 위한 것도 있지만 SSL 암호화 지원도 해줘서
인스턴스에 SSL 인증서를 물리면 인스턴스에서 암/복호화 등등의 리소스 낭비가 이뤄지지만 ELB에 물리면 ELB에서 다 처리되기 때문에
서버 입장에서는 부담이 더 줄어들게 된다.
하지만 역시 공짜는 아니니 Elastic Load Balancing 요금 파트를 참조하자.
돈이 없거나(ㅜㅜ) 공부 목적이 있는 사람은 직접 EC2 인스턴스(서버)에 HTTPS 서버 열기를 참고하자.

Certificate Manager(SSL 인증서)

L4를 생성하기 전에 HTTPS 프로토콜을 위한 SSL 인증서를 만들어야한다.
공짜라고 하니 걱정하지말고 만들자.

  1. Certificate Manager 서비스로 이동한다.
  2. 상단에 있는 인증서 요청 클릭
  3. 도메인 이름 입력(유효한 도메인인지 체크하지 않으므로 일단 원하는 도메인 입력)
  4. 검토 및 요청 클릭 후 확인 및 요청 클릭 후 계속 클릭.
  5. 인증서 검증 보류 상태인데 관리자 이메일로 인증서를 유효하게 만들 수 있는 이메일이 갔을 것이고, 그 이메일을 확인해서 인증서를 확인시켜주자.
  6. 상태가 발급완료로 뜨면 끝.
더 읽어보기 »

기본적으로 서버와 도메인(SSL 인증서에 넣을)은 확보가 돼있는 상태로 진행을 해야한다.
자본이 빵빵하고(?) 좀 더 간단한 걸 원한다면 AWS ELB로 HTTPS 서버 열기를 보자.
해당 포스트는 ELB 말고 인스턴스에 직접 도메인을 달고, 인스턴스에서 직접 HTTPS 서버를 서비스 하고자 하는 포스트이다.

HTTPS

HTTP 통신은 데이터를 암호화하지 않아서 보안에 취약하다.
따라서 HTTPS 프로토콜로 통신을 해야하는데 암/복호화를 하려면 키가 존재해야하고,
그 키는 인증된 기관에서 만든 게 아니면 신뢰할 수 없는 키가 된다.
이 키에 대한 정보가 SSL 인증서에 들어가있는 것이고 이 SSL 인증서를 발급해주는 기관들이 따로 있다.
(사실 SSL의 이름은 TLS로 바뀌었지만 계속해서 SSL로 쓰이는 듯…)
그런데 그 인증서를 발급해주는 기관에서는 돈을 받고 SSL 인증서를 발급해주고 일정 기간마다 돈을 추가로 내서 갱신해야한다.

공짜 SSL 인증서 발급기관

더 읽어보기 »

문제점

Time은 데이터 전체를 파싱하는데 걸린 시간이니 무시하고…
트래픽이 13MB 남짓…
사용자가 조건을 바꿔서 검색을 한다면 데이터 광탈범이 될 가능성이 다분한 상황이었다.

더 읽어보기 »

메이븐은 기본적으로 빌드할 때 프로필을 지정할 수 있는 것 같은데 gradle은 직접 삽질을 하면서 깨달았다.
다음의 글들을 보고 Spring boot 1.5.7과 Gradle 3.x(아마)? 에 맞게, 내 입맛에 맞게 각색해보았다.

Profile 구성하기

기본적인 스프링 부트 프로젝트는 다음과 같은 구조를 가질 것이다.

더 읽어보기 »

근본없이 궁금한 부분만 찾아서 공부하다보니 아직 정리가 덜 된 글이다 보니 그 점은 감안하고 보길 바란다.

컨트롤러를 만들자

Node.js(+Express)의 Router와 매우 유사한 것 같다.
URI와 http method, parameter만 매핑해주는 녀석이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value = "/api")
public class Controller {
@GetMapping("/")
public Person sayHello(
@RequestParam String name,
@RequestParam int age,
@RequestParam(required = false) String hobby
) {
Person person = new Person();
person.setHobby(hobby);
person.setName(name);
person.setAge(age);
return person;
}

@PostMapping("/")
public void sayHello(
@RequestBody Person person
) {
System.out.println(person.getAge());
System.out.println(person.getHobby());
}
}
더 읽어보기 »

근본없이 궁금한 부분만 찾아서 공부하다보니 아직 정리가 덜 된 글이다 보니 그 점은 감안하고 보길 바란다.

properties

Node.js로 서버를 구성하다보면 포트 등등의 설정 정보를 json으로 저장하듯이 스프링 부트에서는 properties 파일을 사용하는 것 같다.
물론 YAML 파일로도 만들 수 있는 것 같은데 일단 아는 게 properties 파일이다보니 그걸로 진행해보겠다.
우선 스프링 부트를 만들면 기본 파일인 application.properties 파일을 아래와 같이 구성해보자.

1
key="asdf"
더 읽어보기 »

beans.xml 파일을 수정해보자.

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="koreanTire" class="KoreanTire"/>
<bean id="americanTire" class="AmericanTire"/>
<bean id="car" class="Car">
<property name="tire2" ref="koreanTire"/>
</bean>
</beans>

beans의 property는 getter/setter와 매핑이 된다.
Car.java를 수정해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Car.java
public class Car {
private Tire tire;
public Car() {}
public Car(Tire tire) {
this.tire = tire;
}
public Tire getTire2() {
return tire;
}
public void setTire2(Tire tire) {
this.tire = tire;
}
}
더 읽어보기 »

Car 클래스를 수정해보자.

1
2
3
4
5
6
7
8
9
10
public class Car {
@Autowired
private Tire tire33;
public Tire getTire() {
return tire33;
}
public void setTire(Tire tire) {
this.tire33 = tire;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:annotation-config />
<bean id="tire33" class="KoreanTire"/>
<bean id="americanTire" class="AmericanTire"/>
<bean id="car" class="Car"/>
</beans>

@Autowired 한 멤버 변수와 bean의 id가 매칭되는 걸 볼 수 있다.
또한 <context:annotation-config />을 추가해줘야하고, property 태그의 생략이 가능하다.

더 읽어보기 »

일반 자바를 가지고 DI를 해본 v3에서는 Car 클래스를 자바 빈즈 스펙을 제대로 준수해서 만들지 않았다.
따라서 한 번 자바 빈즈 스펙에 맞춰 바꿔보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Car {
private Tire tire;
public Car() {}
public Car(Tire tire) {
this.tire = tire;
}
public Tire getTire() {
return tire;
}
public void setTire(Tire tire) {
this.tire = tire;
}
}

getter/setter와 기본 생성자가 있어야 자바 빈즈 스펙을 준수한 것이었는데 저번에는 기본 생성자가 없어서 추가했다.
그럼 이제 beans.xml 파일을 만들고 자바 빈즈 객체들을 등록해보자.

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tire" class="KoreanTire"/>
<bean id="americanTire" class="AmericanTire"/>
<bean id="car" class="Car"/>
</beans>
더 읽어보기 »
0%