0926 ~ 1002
# 0926 ~ 1002
# 0926 - HTTPS ๋์ ๊ณผ์
# HTTPS๋?
HTTPS๋ HyperText Transfer Protocol Secure์ ์ฝ์์ด๋ฉฐ HTTP์ ๋ณด์ ๋ฒ์ ์ด๋ค.
HTTPS๋ TCP ์์ SSL/TLS ์ธต์ ์ถ๊ฐํ์ฌ ์ํธํ, ์ธ์ฆ ๊ทธ๋ฆฌ๊ณ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ์ ํตํด ๋ ์์ ํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค.
# [ ๋์นญํค ]
์ํธํ์ ์ฐ์ด๋ ํค์ ๋ณตํธํ์ ์ฐ์ด๋ ํค๊ฐ ๋์ผํ ๊ธฐ๋ฒ
๋ง์ฝ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋์นญํค ๋ฐฉ์์ผ๋ก ํต์ ์ ํ๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ ํค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ํค๋ฅผ ์ ๋ฌํ๊ธฐ๋ ์ํํ๋ฉฐ ํด๋ผ์ด์ธํธ์ ์์ค์ฝ๋๋ ๋๊ตฌ๋ ์ง ์ด์ด๋ณผ ์ ์์ผ๋ฏ๋ก ๊ฐ์ง๊ณ ์๊ธฐ๋ ๊ต์ฅํ ์ํํ๋ค.
์ฆ, ์๊ฑฐ๋ฆฌ์์ ๋์นญํค๋ฅผ ์์ ํ๊ฒ ์ ๋ฌํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต๋ค.
# [ ๊ณต๊ฐํค(๋น๋์นญํค) ]
๊ณต๊ฐํค์ ๊ฐ์ธํค(๋น๋ฐํค)๋ผ๋ 2๊ฐ์ง ํค๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค.
๊ณต๊ฐํค๋ ๋ง๊ทธ๋๋ก ๋๊ตฌ๋ ํ๋ํ ์ ์๋ ๊ณต๊ฐ๋ ํค๋ฅผ ๋ปํ๋ค. ์ ๋ณด๋ฅผ ๋ณด๋ด๋์ชฝ(ํด๋ผ์ด์ธํธ)์ ์ด ํค๋ฅผ ๊ฐ์ง๊ณ ๋ฐ์ดํฐ๋ฅผ ์ํธํํด์ ์ ์กํ๋ค.
๊ฐ์ธํค(๋น๋ฐํค)๋ ๊ณต๊ฐํค๋ก ์ํธํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณตํธํ ํ ์ ์๋ ํค๋ก์จ ์์ (์๋ฒ)๋ง์ด ๊ฐ์ง๊ณ ์๋ ํค๋ค.
์ด ๋ฐฉ๋ฒ์ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋ง๋ค์ด์ฃผ์ง๋ง ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ด์๋ค.
# [ ์ธ์ฆ์์ CA(Certificate authority) ]
SSL์ ์ ์ฉํ๊ธฐ ์ํด์๋ ์ธ์ฆ์๋ผ๋ ๊ฒ์ด ํ์ํ๋ค.
์ธ์ฆ์์ ๋ด์ฉ์ ํฌ๊ฒ 2๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์๋ค.
- ์๋น์ค์ ์ ๋ณด (CA, ๋๋ฉ์ธ ๋ฑ๋ฑ)
- ์๋ฒ ์ธก์ ๊ณต๊ฐํค (๊ณต๊ฐํค์ ๋ด์ฉ, ๊ณต๊ฐํค์ ์ํธํ ๋ฐฉ์)
์ด ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํด์ฃผ๋ ๊ธฐ์ ์ CA๋ผ๊ณ ํ๋ค. ์ธ์ฆ์๊ฐ ๋ณด์์ ๊ด๋ จ๋ ๊ฒ์ธ ๋งํผ ์ด CA๋ ์ํฅ๋ ฅ์๊ณ ์ ๋ขฐํ ์ ์๋ ๊ธฐ์ ์์๋ง ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ๋ธ๋ผ์ฐ์ ๋ CA๋ฆฌ์คํธ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ง๊ณ ์๋ค. CA๋ชฉ๋ก์ ์๋ ๊ธฐ์ ์ ๊ณต์ธ๋ CA๋ผ๊ณ ํ๋ฉฐ ๋ชฉ๋ก์ ์๋ ๊ธฐ์ ์ ์ฌ์ค CA๋ผ๊ณ ํ๋ค.
# HTTPS ํต์ ๊ณผ์ ๋ฐ ์๋ฆฌ
๊ฐ๋จํ๊ฒ ๋ค์ฌ๋ค๋ณด๋ฉด ๋์๋ฐฉ์์ ๋์นญํค์ ๊ณต๊ฐํค(๋น๋์นญํค) ๋ฐฉ์์ ์ ๋ถ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
๋ฐ์ดํฐ ์ ์ก์ ์ํด ๋์นญํค ๋ฐฉ์์ ์ฌ์ฉํ๋ฉฐ ๋์นญํค๋ฅผ ์์ ํ๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ๊ณต๊ฐํค ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
# 1. Client Hello
๋ธ๋ผ์ฐ์ ๋ง๋ค ์ง์ํ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ๊ณผ TLS ๋ฒ์ ์ด ๋ค๋ฅด๋ฏ๋ก ํด๋น ์ ๋ณด๋ฅผ ์ ์กํ๋ฉฐ, ๋์ ๊ฐ์ ์์ฑํ์ฌ ์ ์กํ๋ค.
# 2. Server Hello
์ฌ์ฉํ TSL ๋ฒ์ , ์ฌ์ฉํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ, ๋์๊ฐ์ ์ ์ก
# 3. Certificate
CA๋ก ๋ถํฐ ๋ฐ๊ธ๋ฐ์ ์ธ์ฆ์๋ฅผ ์ ์กํ๋ค.
# 4. Server Key Exchange
ํค ๊ตํ์ ํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ๋ง์ฝ ํ์ํ์ง ์์ผ๋ฉด ์ด ๊ณผ์ ์ ์๋ต์ด ๊ฐ๋ฅํ๋ฐ, ์๋ฅผ ๋ค์ด ํค๊ตํ ์๊ณ ๋ฆฌ์ฆ์ Diffie-Hellman์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ์์, ์์๊ทผ ๋ฑ์ด ํ์ํ๋ฏ๋ก ์ด๊ฒ์ ์ ์กํ๋ค.
# 5. Certificate Request
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์ธ์ฆํด์ผํ ๋ ์ธ์ฆ์๋ฅผ ์๊ตฌํ๋ ๋จ๊ณ์ด๋ค. ์์ฒญํ์ง ์์ ์ ๋ ์๋ค.
# 6. ServerHello Done
# 7. Client Key Exchange, Change Cipher Spec
pre-master-key ๋ผ๋ ๊ฒ์ ์ ์กํ๋ค. ์ด ํค๋ 1,2 ๋จ๊ณ์์ ์์ฑํ ๋์๋ฅผ ์กฐํฉํ์ฌ ์์ฑํ๊ฒ๋๋ฉฐ ๋์นญํค๋ก ์ฌ์ฉํ๊ฒ๋ ์์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์์ ํ ์ ์ก์ ์ํด์ ๊ณต๊ฐํค ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ ์กํ๋ค.
# 8. Change Cipher Spec
ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ์ ์ก๋ฐ์ Pre-master-key๋ฅผ ์ ์์ ์ผ๋ก ๋ณตํธํ ํ master-key(๋์นญํค)๋ก ์น๊ฒฉ ํ ๋ณด์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ฉํ๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ๋ณด๋ด๋ ์๋์ด๋ค.
# 0927 - ์กฐํ ๋น(Bean)์ด 2๊ฐ ์ด์์ผ๋ ๋์ ์ผ๋ก ์ ํํ๋ ๋ฐฉ๋ฒ
- ์ธํฐํ์ด์ค ๋ฐ ๊ตฌํ์ฒด
interface SampleInterface {
...
}
@Repository
public class SampleInterfaceImpl implements SampleInterface {
...
}
@Repository
public class SampleInterfaceOtherImpl implements SampleInterface {
...
}
# ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํด๋๊ณ ๋ถ๊ธฐ์ฒ๋ฆฌ
@Controller
public class SampleController {
@Autowired
private SampleInterfaceImpl basic;
@Autowired
private SampleInterfaceOtherImpl other;
@RequestMapping(path = "/path/Basic", method = RequestMethod.GET)
public void basic() {
basic.sampleMethod();
}
@RequestMapping(path = "/path/Other", method = RequestMethod.GET)
public void other() {
other.sampleMethod();
}
}
# ์ธํฐํ์ด์ค๋ฅผ Map์ ๋ฃ์ด๋๊ณ ๊บผ๋ด์ ์ฌ์ฉ
@Controller
public class SampleController {
@Autowired
private SampleInterfaceImpl basic;
@Autowired
private SampleInterfaceOtherImpl other;
Map<String, SampleInterface> services;
@PostConstruct
void init() {
services = new HashMap()<>;
services.put("Basic", basic);
services.put("Other", other);
}
@RequestMapping(path = "/path/{service}", method = RequestMethod.GET)
public void method(@PathVariable("service") String service){
SampleInterface sample = services.get(service);
// remember to handle the case where there's no corresponding service
sample.sampleMethod();
}
}
# ApplicationContext๋ฅผ ํ์ฉ
๊ตฌํ์ฒด๋ฅผ bean์ผ๋ก ๋ฑ๋กํ๊ณ
@Component
public class SampleInterfaceImpl implements SampleInterface {
public void sampleMethod() {
// ...
}
}
@Component
public class SampleInterfaceOtherImpl implements SampleInterface {
public void sampleMethod() {
// ...
}
}
ApplicationContext์ getBean()์ผ๋ก ๊ตฌํ์ฒด๋ฅผ ๋ก๋ฉํ์ฌ ์ฌ์ฉํ๋ค.
@Controller
public class SampleController {
@Autowired
private ApplicationContext appContext;
@RequestMapping(path = "/path/{service}", method = RequestMethod.GET)
public void method(@PathVariable("service") String service){
SampleInterface sample = appContext.getBean(service, SampleInterface.class);
sample.sampleMethod();
}
}
# Spring์ DI ํ์ฉ
set์ด๋ list, map์ ํตํด ์๋์ผ๋ก ๋ฑ๋กํ๋ค.
@Autowired
private List<SampleInterface> SampleInterfaces;
---
@Autowired
private Map<String, SampleInterface> SampleInterfaceMap;
---
void excuteSampleMethod() {
String interfaceName = ""
//enum์ผ๋ก ๊ตฌ๋ถํ๊ฑฐ๋, ์กฐ๊ฑด์ ๋ง๊ฒ ์๋์ผ๋ก๋ถ๊ธฐํ๊ฑฐ๋ ์๋น์ค์๋ง๊ฒ ๊ณ ๋ฅธ๋ค.
if (isFirst()) {
interfaceName = "SampleInterfaceImpl"
} else {
interfaceName = "SampleInterfaceOtherImpl"
}
SampleInterface impl = SampleInterfaceMap.get(interfaceName);
impl.sampleMethod();
- enum์ผ๋ก ์ ์ฑ ์ ํ๊ธฐ
public enum SampleType {
SAMPLE("SampleInterfaceImpl"),
OTHERS("SampleInterfaceOtherImpl")
SampleType(String implementation) {
this.implementation = implementation;
}
public String getImplementation() {
return this.implementation;
}
}
---
void excuteSampleMethod(SampleType sampleType) {
SampleInterface impl = SampleInterfaceMap.get(sampleType.getImplementation);
impl.sampleMethod();
}
---
@Component
@RequiredArgsConstructor
public class SampleInterfaceRouter {
private final List<SampleInterface> sampleInterfaces; //์์กด์ฑ List๋ก ์ฃผ์
public SampleInterface getImplemetationByType(SampleType sampleType) {
return sampleInterfaces.stream()
.filter(e -> e.isAvailableType(sampleType)) //๊ฐ ๊ตฌํ์ฒด์์ ํ๋จ
.findFirst().orElseThrow(() -> new NotSupportedTypeException());
}
}
# 0929 - Java HashMap
# Hash
Hash๋ ์๋ฃ๋ฅผ ์ผ์ ํ ํ์์ ์๋ณ ๊ฐ์ด๋ค.
- Key : ๊ณ ์ ํ ๊ฐ, Hash function์ input.
- Hash function : Key๋ฅผ Hash๋ก ๋ณ๊ฒฝํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- Hash Code(๋๋ Hash Value) : ํด์ ํจ์๋ฅผ ํตํด ์ป๋ ๊ฐ์ผ๋ก, ํด์๋ฅผ ์ธ๋ฑ์ค ๋๋ ์ฃผ์๋ก ์ผ์ Value์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ค.
- Value : Key์ 1:1๋ก ๋งคํ๋์ด ์๋ ๊ฐ์ผ๋ก Bucket์์ ๋ค์ด๊ฐ ์๋ ์ค์ ๊ฐ์ด๋ค.
- Bucket : ํด์์ ๋งคํ๋๋ ๊ฐ(Value)์ด ์ ์ฅ๋์ด ์๋ ๊ณต๊ฐ์ด๋ค.
# HashMap
- HashMap์ Key-Value๊ฐ 1:1๋ก Mapping ๋๋ ์๋ฃ๊ตฌ์กฐ์ด๋ฉฐ, Mapping์ผ๋ก ์ธํด ์ฝ์ , ์ญ์ , ๊ฒ์์ด ํ๊ท ์ ์ผ๋ก O(1)์ธ ์๋ฃ๊ตฌ์กฐ์ด๋ค. Key๋ ์ค๋ณต์ ํ์ฉํ์ง ์์ง๋ง, Value๋ ์ค๋ณต์ ํ์ฉํ๋ค.
- Java HashMap์ Key๋ Object ํ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์์ ํ ํด์ ํจ์๊ฐ ์๋๋ค.
- Java HashMap์ index๋
hashCode() % M
(M = ํด์ ๋ฒํท์ ๊ฐ์)๋ก ์ฐ์ถํ ์ ์๋ค. - Java HashMap ํด์ ์ถฉ๋์ด ์ผ์ด๋ ๊ฒฝ์ฐ, ์ถฉ๋ ์ฒ๋ฆฌ๋ฐฉ๋ฒ์ผ๋ก Worst Case๋ฐ์ ๋น๋๋ฅผ ์ค์ผ ์ ์๋ Separate Chaining๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- Java8์ด์ HashMap์์๋ ํ๋์ ํด์ ๋ฒํท์ 8๊ฐ์ key-value ์์ด ๋ชจ์ด๋ฉด ๋งํฌ๋๋ฆฌ์คํธ๋ฅผ ํธ๋ฆฌ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋์ด 8๊ฐ์ ์ด๋ฅด๋ฉด ๋ค์ ๋งํฌ๋ ๋ฆฌ์คํธ๋ก ๋ณ๊ฒฝํ๋ค.
- String ํด๋์ค์ hashCode() ๋ฉ์๋์์๋ ์ฑ๋ฅ ํฅ์ ๋๋ชจ๋ฅผ ์ํด 31์ ์น์๋ก ์ฌ์ฉํ๋ค.
# 0930 - Maven package์ install์ฐจ์ด
# Maven ๋น๋ ๋ผ์ดํ์ฌ์ดํด ๋จ๊ณ
- validate : ํ๋ก์ ํธ๊ฐ ์ ํํ๊ณ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ์ ์๋์ง ํ์ธ
- compile : ํ๋ก์ ํธ ์์ค ์ฝ๋ ์ปดํ์ผ
- test : ๋จ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ ์์ค ์ฝ๋๋ฅผ ํ ์คํธ
- package : ์ปดํ์ผ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ JAR์ ๊ฐ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ํํ๋ก ํจํค์ง
- verify : ํ์ง ๊ธฐ์ค์ด ์ถฉ์กฑ๋์ด์๋์ง ํ์ธํ๊ธฐ ์ํด ํตํฉ ํ ์คํธ ๊ฒฐ๊ณผ์ ๋ํ ๋ชจ๋ ๊ฒ์ฌ ์คํ
- install : ๋ก์ปฌ์์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ข ์์ฑ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํจํค์ง๋ฅผ ๋ก์ปฌ ์ ์ฅ์์ ์ค์น
- deploy : ๋น๋ ํ๊ฒฝ์์ ์๋ฃ๋๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์ ๋ฐ ํ๋ก์ ํธ์ ๊ณต์ ํ๊ธฐ ์ํด ์ต์ข ํจํค์ง๋ฅผ ์๊ฒฉ ์ ์ฅ์์ ๋ณต์ฌ
# [ ์ฐจ์ด์ ]
package์ install์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ install์ ๊ฒฝ์ฐ package ํ ๋ง๋ค์ด์ง ์ฐ์ถ๋ฌผ์ ๊ฐ์ ๋จธ์ ์ ๋ก์ปฌ ์ ์ฅ์์ ๋ฐฐํฌํ์ฌ ์ข ์์ฑ์ด ์๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค๋ ์