jdk8 이후 문법 공부 안하셨죠?(저도 그래요😄) Amber 프로젝트를 알면 Java의 주요 언어 변경사항에 대해 쭉 정리가 됩니다.
## Project Amber
- 소개
Project Amber의 목표는 [OpenJDK JEP 프로세스](https://openjdk.org/jeps/1) 에서 JEP 후보로 승인된 더 작고 생산성 지향적인 Java 언어 기능을 탐색하고 배양하는 것입니다 . 이 프로젝트는 [컴파일러 그룹](https://openjdk.org/groups/compiler) 의 후원을 받습니다 .
대부분의 Project Amber 기능은 Java 플랫폼의 공식 부분이 되기 전에 최소한 두 번의 [_미리보기를 거칩니다._](https://openjdk.org/jeps/12) 특정 기능에 대해 각 미리보기 라운드와 최종 표준화를 위한 별도의 JEP가 있습니다. 이 페이지는 기능에 대한 최신 JEP에만 연결됩니다. 이러한 JEP에는 해당 기능에 대한 이전 JEP에 대한 링크가 있을 수 있습니다.
(https://openjdk.org/projects/amber/ 에서 발췌 번역함)
[!NOTE] JEP
- JDK Enhancement-Proposal & Roadmap Process
- amber 프로젝트는 이런 실험적인 생각들을 배양하는 프로젝트이다.
- JSR로 발전할 수 도 있고 아닐 수도 있다.
- 진행중인 JEP들을 가만히 보면 Javascript의 구조할당분해 기능과 유사한 제안이 많다. Python에도 유사 기능이 있다.
```js
const { name, age } = { name: 'matthew', age: 23 }
```
- record는 데이터 전달 객체를 많이 다루는 java 에서 불변객체로 만들기 위한 노력이 많이 드는 것을 극복하기 위해 만들어졌다.
```java
class Point {
private final int x;
private final int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
int x() { return x; }
int y() { return y; }
public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point other = (Point) o;
return other.x == x && other.y = y;
}
public int hashCode() {
return Objects.hash(x, y);
}
public String toString() {
return String.format("Point[x=%d, y=%d]", x, y);
}
}
```
- "var"라는게 있는지 모르는 개발자도 많을 걸?
```java
// jdk 10
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
// jdk 11 부터는 람다식에도 쓸 수 있다.
(var x, var y) -> x.process(y)
// 람다식은 원래 타입추론이므로 적어줄 필요가 없는데
// 굳이 var를 적어줘야하는 이유는 아래처럼 annotation을 쓸 수 있다.
@Nonnull var x = new Foo();
(@Nonnull var x, @Nullable var y) -> x.process(y)
```
- [JEP 459: String Templates (Second Preview)](https://openjdk.org/jeps/459) 이런 것도 진행중입니다.
## 코딩해봅시다
```java
@RestController
@SpringBootApplication
public class DemoSpringApplication {
public static void main(String[] args) {
SpringApplication.run(DemoSpringApplication.class, args);
}
@GetMapping("/greeting")
public String greeting(@RequestParam String name) {
// arrow, inline : jdk 14 이상
Loan loan = switch(name) {
case "matthew" -> new SecuredLoan();
default -> new UnSecuredLoan(0.0047f);
};
// yield : jdk 14 이상
// pattern matching : jdk 21 이상
String message = switch(loan) {
case SecuredLoan secureLoan -> name + " 무이자“;
case UnSecuredLoan usl -> {
yield name + " : " + usl.interest;
}
};
return message;
}
// sealed 클래스/인터페이스 : jdk 17 이상
// permits 키워드를 이용하여 상속 / 구현 할 클래스를 미리 지정한다.
sealed interface Loan permits SecuredLoan, UnSecuredLoan {}
// seald 클래스 / 인터페이스를 상속 / 구현하는 클래스는 final 필수
final class SecuredLoan implements Loan {}
record UnSecuredLoan (float interest) implements Loan {}
}
```
## when
```java
String s = switch (score) {
case 100 -> "Perfect!";
case Integer i when i >= 90 -> "Very Good!";
case Integer i when i >= 80 -> "Good!";
default -> "Bad";
}
```
## null
```java
return switch(value) {
case null, default -> "default";
case 1 -> A;
case 2 -> B;
}
```
## Record Pattern
```java
// jdk 16
if (obj instanceof Student student) {
student.study();
String name = student.getName():
System.out.println(name);
}
```
```java
// jdk 21
if (obj instanceof Student(String name)) {
student.study();
System.out.println(name);
}
```
## for 문
```java
Iterable<String> iterable = ...;
for (String s: iterable) {
// Do something with s
}
// 이렇게 쓰던걸 아래처럼 ...
///////////////////////////////////////
record Point(double x, double y) {}
List<Points> points = ...;
for (Point(double x, double y): points) {
// Do something with x and y
}
```
Session 대신 JWT를 사용하는 이유 실 서버는 하나의 인스턴트로만 동작하지 않는다. 서버의 고가용성(high availabliity, HA)을 확보하기 위해 두 개 이상의 병렬서버로 운영하게 된다. 서버가 병렬로 운영되는 상황에서 세션을 사용하면 각 서버간의 세션을 동기화하는 문제가 발생한다. 이를 해결하기 위해 공유 데이터베이스를 이용한 세션공유 기법들을 사용하기도 한다. 서버가 많아지면 세션동기는 더 어렵다. JWT를 사용하면 세션사용으로 인한 서버 자체에 부담도 줄이면서 공유 세션에 대한 관리가 한층 수월하다. 스프링 시큐리티 - SecurityConfig.java session을 사용하지 않도록 설정 jwtAuthFilter 추가 httpBasic 제거 - JwtAuthenticationFilter.java config.filter 패키지에 파일 추가 jwt dependency 추가 (3개). gradle refresh하는 거 까먹지 말기 config.service 패키지에 [JwtService.java](http://JwtService.java) 추가 jwtService와 UserDetailService final field 추가. @RequiredArgsConstructor 까먹지 말기 - config.service.JwtService 소스 참조해서 파일 작성 - controller, service 수정 User 를 리턴하면 pwd가 그대로 노출되므로 AuthResponse와 AuthRequest로 교체 Github https://github.com/ohhoonim/factory.git 유튜브 영상 스프링부트 - 보안 JWT JWT - refresh 토큰과 logout
``` [!NOTE] Winddows와 Macos macos를 기준으로 설명하고 있으나, 거의 대부분 macos의 `Cmd`키를 `Ctrl`키로 변경하면 windows에서도 그대로 사용할 수 있음 ``` # VSCode 단축키 - `Cmd + p` : 파일 오픈을 위한 palette - `Cmd + shift + p` : 명령어 실행을 위한 palette. `Cmd + p` 한 다음 '>'를 입력해도 됨 - `Cmd + shift + o` : 현재파일에서 심볼 찾기 (field, method, function 등). `Cmd + p`한 다음 '@'를 입력해도 됨 - `Cmd + Opt + ` : 열려있는 편집기 전환 - `Cmd + shift + e` : 편집기와 탐색기를 전환 함. (탐색기에서 vim 커서 이동 키도 동작한다는 것이 핵심) - `Cmd + Opt + ` : 열모드로 블럭 지정. (VIM단축키와 조합하면 최상임. 이건 글로 설명이 안됨) --- ``` [!NOTE] VSCode용 Vim 확장 - 여기서는 vscodevim 에서 제작한 Vim 확장을 설치하여 사용한다. Vim 단축키는 다를 바 없다. - `esc`키를 눌러 Normal모드 진입시 '한글' 입력상태인 경우 많이 불편하다. '한영'을 자동으로 변환해주는 여러 방법들을 써봤지만, 몇 일 지나면 풀려서 잘 동작 안한다. 그냥 Normal 모드 진입시 '한영'변환을 신경써서 잘 해주자. (시간낭비하지 마세요) - macos의 경우 `Cmd`키와 `Caps`키를 바꾸자. - Windows의 경우 `Ctrl`키와 `Caps`키를 바꾸자. (써보면안다. 얼마나 편한지) ``` ``` [!warning] - 표기된 모든 단축키는 `대소문자`를 구분합니다. (shift 입력하기 귀찮아서임) - `잘라내기`라고 표기한 것은 `붙여넣기`가 가능하다는 뜻입니다. - VIM 모드 전환은 직...
설치하기에 앞서 테스팅 이야기 ISO/IEC/IEEE 29119 에서는 소프트웨어 테스팅의 표준standard에 대해 정의하고 있습니다. 돈받고 파는 문서를 '표준'이라고 번역하기는 좀 껄끄러운데요. 'standard'는 비지니스를 안정적으로 수행할 수 있는 잘 정리된 '가이드' 정도가 올바른 번역이 아닐까 생각됩니다. 소프트웨어에 표준이 있다면 얼마나 좋겠습니까마는 no silver bullet 이라는 말도 있듯이 이건 그냥 iso에서 제시하는 가이드일 뿐이라는 것이 개인적인 의견입니다. 뭐 대단한거 한다고 시작하는데 말이 많군요. (^^;) 29119 part2에서는 테스트프로세스를 다루고 있구요. 이 중 test management process 항목이 있습니다. 어딜가나 비지니스가 끼어드니 management는 빠지는 곳이 없네요. 먹고살려면 어쩔수 없죠. 경영진을 설득하기 위한 부단한 연구라고 인정하는 수밖에. 출처 : http://softwaretestingstandard.org/part2.php 테스팅 서버를 구성하는 이유는 test management process 관점에서 'test monitoring & control'이 필요하기 때문입니다. (위 그림에서 가운데 노란색 박스) testlink 는 오픈소스로서 전 세계에서 가장 많이 사용되고 있는 툴이며 monitoring과 control을 위해 적절한 기능을 제공하고 있다고 판단됩니다. 맨티스는 testing completion 조건을 만족시키기 위한 테스팅 조직과 개발 조직간의 협업툴로서 이용될 수 있습니다. 개발조직에서는 맨티스와 같은 버그 리포트 툴을 사용하고 있으며 bugzilla, jira와 같은 다른 버그리포트 툴로 대체될 수 있습니다. 본 포스팅에서는 monitoring & control 을 수행하기 위한 테스팅 환경 구축이라고 보시...
댓글
댓글 쓰기