2021-02-05-TIL
2021-02-05-TIL
Serialize
객체를 스트림으로 바꿔주는 자바의 기능
직렬화는 메모리에 있는 객체를 바이트의 흐름으로 바꿔 파일에 저장하거나 네트워크로 보낼 수 있게 하는 것이고, 역직렬화는 그 반대다. Java에서는 클래스가 java.io.Serializable을 구현해야 직렬화할 수 있다. Javadoc에 따르면 이 인터페이스에는 메서드도 필드도 없고, 직렬화 가능하다는 의미를 표시하는 역할만 한다.
Javadoc은 직렬화할 클래스에 serialVersionUID를 직접 선언하라고 강하게 권한다. 선언하지 않으면 컴파일러가 클래스 구조로 값을 계산하는데, 이 계산이 클래스 세부 사항과 컴파일러 구현에 민감해서 역직렬화할 때 예상치 못한 InvalidClassException이 날 수 있기 때문이다.
1
2
3
4
public class Member implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
}
가중치가 있는 랜덤과 난수 테이블
이미 만들어놓은 필드에서는 1 1 1 1 1 2 3 4 5 5 이런식으로 가중치를 조정할 수 있다.
후보를 담은 배열에서 무작위로 한 칸을 고르면 각 칸이 뽑힐 확률은 같다. 그래서 같은 값을 여러 칸에 넣으면 그 값의 확률이 칸 수만큼 커진다. 위 배열에서 1은 10칸 중 5칸이라 50%, 5는 20%, 2·3·4는 각각 10%로 뽑힌다. 테이블을 바꾸는 것만으로 확률을 조정할 수 있어 간단하다.
실제로 100명중에 5명이 걸리도록 하려면? 미리 랜덤을 돌려서 테이블을 DB에 넣어놓는다. 그리고 유저가 어디에 배정될지가 랜덤으로 정해진다. 하지만 유저는 랜덤 테이블 자체의 인덱스를 추정하기 시작했다. 난수테이블을 공격하는 기법과 유사하다.
미리 만든 테이블은 “정확히 100명 중 5명”을 보장할 수 있다는 장점이 있지만, 테이블과 순서가 고정되어 있으므로 결과를 관찰하면 다음 결과를 추측할 수 있게 된다. 난수 생성기 자체도 마찬가지다. java.util.Random Javadoc은 이 클래스의 인스턴스가 암호학적으로 안전하지 않다고 밝히고, 보안이 중요한 곳에는 SecureRandom을 쓰라고 권한다. 결과에 돈이나 보상이 걸려 있다면 사용자가 추측할 수 있는지부터 따져 봐야 한다.
메서드 이름
명확하게 값을 리턴해주는 경우는 메서드 이름을 그냥 명사로 하는것이 더 깔끔할 수도 있다. 또 Getters와 구분이 되기도 할 것 같다.
예를 들어 list.size(), str.length()는 getSize(), getLength()가 아니라 명사만 쓴다. 계산 결과를 돌려주는 메서드를 getXxx()로 지으면 필드를 그대로 꺼내는 getter처럼 보여, 내부에 비용이 드는 계산이 있다는 사실이 가려질 수 있다.
로그프레임워크
- 골드버그 장치 : 나무위키
골드버그 장치는 간단한 일을 일부러 복잡한 연쇄 과정을 거쳐 해내는 장치다.
백엔드 개발자 연봉 올리는 방법
주니어한테 절대로 맡기지 않는 업무와 기술을 미리 습득해라.
키워드 : CI/CD, Docker(Container), Kubernetes(Orchestration), Cloud Compute(AWS) and AWS에 신용카드 바로 등록하기
돈을 받으면서 일하는것은 완전히 다른일이다. 개발 자체를 위한 개발을 하면 안된다. 오히려 정해진 시간내에 제품을 출시하는것이 중요한 경우가 많다. 비즈니스가 코딩보다 위에 있어야한다. 그리고 그 비즈니스를 해결하는데는 보통 큰 기술이 필요하지 않다.
키워드들은 모두 코드를 작성한 다음 단계, 즉 코드를 빌드하고 배포하고 운영하는 일과 관련이 있다. CI/CD는 코드 변경을 자동으로 빌드·테스트하고 배포까지 이어 주는 파이프라인이다. Docker 문서는 Docker를 애플리케이션을 컨테이너라는 느슨하게 격리된 환경에 담아 실행하는 플랫폼으로 설명하고, 컨테이너에는 애플리케이션 실행에 필요한 것이 모두 들어 있다고 말한다. Kubernetes 문서는 Kubernetes를 컨테이너로 만든 워크로드와 서비스를 관리하는 오픈소스 플랫폼으로 소개한다. 이런 일은 운영 중인 서비스에 직접 영향을 준다.
개발자 커리어 관리
- GitHub - 개발자의 sns
- LinkedIn - 직장인의 sns
- Resume - 이력서 관리
가변인자 in Java
가변인자(varargs)는 String... names처럼 타입 뒤에 ...을 붙여 인자 개수를 정하지 않는 매개변수다. JLS 8.4.1에 따르면 가변인자는 메서드마다 하나만, 맨 마지막 매개변수로만 둘 수 있다. 호출할 때 넘긴 남은 인자들은 배열에 담겨 전달되므로, 메서드 안에서는 names를 배열처럼 다룬다.
1
2
3
4
5
6
7
8
static int sum(int... numbers) {
int total = 0;
for (int n : numbers) total += n;
return total;
}
sum(); // 0, 빈 배열이 전달된다
sum(1, 2, 3); // 6
초기화 블록
클래스 안에 { ... }로 둔 코드 블록이 인스턴스 초기화 블록이고, static { ... }이 정적 초기화 블록이다. JLS 8.6과 8.7에 따르면 인스턴스 초기화 블록은 인스턴스가 만들어질 때, 정적 초기화 블록은 클래스가 초기화될 때 실행된다. 정적 블록은 클래스당 한 번만 실행되므로 상수 테이블을 채우는 일 같은 데 쓴다.
1
2
3
4
5
6
7
8
9
10
11
class Config {
static final Map<String, String> DEFAULTS = new HashMap<>();
static {
DEFAULTS.put("mode", "dev"); // 클래스 초기화 때 한 번
}
List<String> items;
{
items = new ArrayList<>(); // 인스턴스를 만들 때마다
}
}
자바 초기화
객체를 만들 때의 순서는 JLS 12.5에 정해져 있다. 상위 클래스 생성자가 먼저 실행되고, 그다음 이 클래스의 인스턴스 변수 초기화식과 인스턴스 초기화 블록이 소스에 적힌 순서대로 실행되며, 마지막으로 생성자의 나머지 본문이 실행된다. 이 순서 때문에 상위 클래스 생성자에서 하위 클래스가 오버라이딩한 메서드를 부르면, 하위 클래스 필드가 아직 기본값(0, null)인 상태로 보이는 일이 생긴다. JLS 12.5의 예제가 바로 이 경우를 보여 준다.
댓글
아직 댓글이 없습니다