※다운로드하시면 더 선명한 자료를 보실 수 있습니다.
서버 사이드에서도 Spring 5를 통해 공식적으로 지원이 시작된 후,
Spring을 이용한 많은 서비스가 Java를 대신하여 Kotlin을 적용하고 있습니다.
본 세션에서는 PAYCO 매거진 프로젝트에 Kotlin을 적용했던 경험과 시행착오를 나누어 보려 합니다.
목차
1. Introduction
2. Motivation
3. Kotlin
4. Migration
5. Refactoring
6. Report
7. Conclusion
대상
Kotlin이라는 언어를 들어보신 분이라면 누구나
■관련 동영상: https://youtu.be/wiJqu7xoH58
28. // Java
public class Member {
private Integer memberId;
private int age;
private String name;
public void setMemberId(Integer memberId) {
if(memberId == null) {
// do something
}
this.memberId = memberId;
}
...
}
Integer nullableNumber = null;
member.setAge(nullableNumber);
// runtime error!!
// Kotlin
data class Aritcle(
var articleId: Int? = null,
var viewCount: Int = 0,
var title: String = “”
...
)
// use case
var nullableNum: Int? = null
article.viewcount = nullableNum
// Java
public class Article {
private Integer articleId;
private int viewCount;
private String title;
...
public void setViewCount(int viewCount) {
this.viewCount = viewCount;
}
}
// use case
Integer nullableNum = null;
article.setViewCount(nullableNum);
29. // Java
public class Member {
private Integer memberId;
private int age;
private String name;
public void setMemberId(Integer memberId) {
if(memberId == null) {
// do something
}
this.memberId = memberId;
}
...
}
Integer nullableNumber = null;
member.setAge(nullableNumber);
// runtime error!!
// Kotlin
data class Aritcle(
var articleId: Int? = null,
var viewCount: Int = 0,
var title: String = “”
...
)
// use case
var nullableNumber: Int? = null
article.viewcount = nullableNumber
// Java
public class Article {
private Integer articleId;
private int viewCount;
private String title;
...
public void setViewCount(int viewCount) {
this.viewCount = viewCount;
}
}
// use case
Integer nullableNum = null;
article.setViewCount(nullableNum);
30. // Java
public class Article {
private Integer articleId;
private int viewCount;
private String title;
...
public void setViewCount(int viewCount) {
this.viewCount = viewCount;
}
}
Integer nullableNum = null;
article.setViewCount(nullableNum);
// Kotlin
data class Aritcle(
var articleId: Int? = null,
var viewCount: Int = 0,
var title: String = “”
...
)
// use case
var nullableNum: Int? = null
article.viewcount = nullableNum
57. // auto-converted Kotlin
class Article {
var articleId: Int? = null
var viewCount: Int = 0
var title: String? = null
override fun toString(): String {
return “Article{”
+ “articleId=“ + articleId
+ “, viewCount=” + viewCount
+ “, title=‘” + title
+ ‘’’.toString() + ‘}’.toString()
} ...
}
// Java without Lombok
public class Article {
private Integer articleId;
private int viewCount;
private String title;
public Integer getMemberId() {
return this.memberId;
}
...
}
58. // refactored Kotlin
data class Article (
var articleId: Int? = null
var viewCount: Int = 0
var title: String = “”
)
// auto-converted Kotlin
class Article {
var articleId: Int? = null
var viewCount: Int = 0
var title: String? = null
override fun toString(): String {
return “Article{”
+ “articleId=“ + articleId
+ “, viewCount=” + viewCount
+ “, title=‘” + title
+ ‘’’.toString() + ‘}’.toString()
} ...
}
59.
60. @Slf4j
public class LogExaple {
}
// Java
@Controller
public class ArticleController {
@Autowired
private ArticleService articleService;
@Autowired
private TagService tagService;
}
@Slf4j
public class LogExaple {
}
// Kotlin
@Controller
class ArticleController {
@Autowired
private var articleService : ArticleService
@Autowired
private var tagService : TagService
}
동작하지 않는 필드 주입
61. @Slf4j
public class LogExaple {
}
// Java
@Controller
public class ArticleController {
@Autowired
private ArticleService articleService;
@Autowired
private TagService tagService;
}
@Slf4j
public class LogExaple {
}
// Kotlin
@Controller
class ArticleController {
@Autowired
private var articleService : ArticleService?
= null
@Autowired
private var tagService : TagService?
= null
}
62. @Slf4j
public class LogExaple {
}
// Java
@Controller
public class ArticleController {
@Autowired
private ArticleService articleService;
@Autowired
private TagService tagService;
}
@Slf4j
public class LogExaple {
}
// Kotlin
@Controller
class ArticleController {
@Autowired
private lateinit var articleService :
ArticleService
@Autowired
private lateinit var tagService : TagService
}
63. @Slf4j
public class LogExaple {
}
// Java
@Controller
public class ArticleController {
private final ArticleService articleService;
private final TagService tagService;
public ArticleController(
final ArticleService articleService,
final TagService tagService) {
this.articleService = articleService;
this.tagService = tagService;
}
}
@Slf4j
public class LogExaple {
}
// Kotlin
@Controller
class ArticleController(
private val articleService : ArticleService,
private val tagService : TagService) {
}
70. @Slf4j
public class LogExaple {
} when (x) {
0, 1 -> print("x == 0 or x == 1")
parseInt(s) -> print("s encodes x")
isEven() -> print("x is even")
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
is String -> x.startsWith("prefix")
else -> print("otherwise")
}