분류 전체보기 1341

JAVA 프로젝트에 코틀린 설정 적용

JAVA의 build.gradle plugins { id 'org.springframework.boot' version '2.7.0' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.fastcampus.kotlinspring' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:sp..

JAVA 기반 스프링 프로젝트에 코틀린 적용

build.gradle plugins { id 'org.springframework.boot' version '2.7.0' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.jetbrains.kotlin.jvm' version "1.6.21" } group = 'com.fastcampus' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly..

코틀린과 롬복

Lombok을 사용한 JAVA 코드 @EqualsAndHashCode @ToString public class Hero { @Getter @Setter private String name; @Getter @Setter private int age; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public static void main(String[] args) { /* Hero hero = new Hero(); hero.setName("아이언맨"); hero.setAge(53); hero.setAddres..

JAVA에서 확장함수 사용하기

Kotlin 코드 fun String.first(): Char { return this[0] } fun String.addFirst(char: Char): String { return char + this.substring(0) } fun main() { println("ABCD".first()) println("ABCD".addFirst('Z')) //원래 있던 함수처럼 사용 가능하다 } JAVA 코드 public class ExtensionExample { public static void main(String[] args) { /* "ABCD".first(); "ABCD".addFirst('Z'); //컴파일 오류 발생 */ char first = MyExtensionsKt.first("ABCD")..

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - DTO,Controller를 Kotlin으로 변경하기

DTO 변경하기 UserResponse //DTO는 취지에 맞게 data클래스로 만든다 data class UserResponse( val id: Long, val name: String, val age: Int?, ) { /* constructor(user: User): this( id = user.id!!, name = user.name, age = user.age ) */ companion object{ fun of(user: User): UserResponse{ return UserResponse( id = user.id!!, name = user.name, age = user.age, ) } } } JAVA 클래스/패키지에 마우스 우측 클릭 -> convert Java File to Kotlin..

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - 서비스 계층 Kotlin으로 변경하기

UserService @Service class UserService( private val userRepository: UserRepository, ) { //Transactional 기능을 사용하기 위해서는 오버라이드 될 수 있어야 하는데, 코틀린은 함수를 기본적으로 상속이 불가능하기 떄문에 오류가 발생한다. //open 키워드를 붙여서 상속이 가능하도록 해도 되지만, 플러그인을 추가해도 된다(spring) @Transactional fun saveUser(request: UserCreateRequest) { val newUser = User(request.name, request.age) userRepository.save(newUser) } @Transactional(readOnly = true)..

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - Repository를 Kotlin으로 변경하기

BookRepository interface BookRepository : JpaRepository { fun findByName(bookName: String): Optional //코틀린에서는 Optional이 필요 없다 } 코틀린에서 상속은 : 연산자 뒤에 쓰면 된다. Optional 같은 경우 코틀린에서 더 이상 사용하지 않아도 된다 (? 연산자를 사용하면 null을 허용하는 타입이 되기 때문) 현재는 JAVA에서 그대로 사용하기 위해, Optional을 사용했다. UserRepository interface UserRepository : JpaRepository { fun findByName(name: String): Optional } UserLoanHistoryRepository interf..

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - Kotlin과 JPA를 함께 사용할 때 주의할 점

Setter setter를 사용하는 대신, 명시적인 이름의 가진 함수를 사용하는 것이 훨씬 clean 하다. -> setter를 열어둔다는 것은, 어디서든 이 setter를 호출할 수 있다는 것을 의미하기 때문이다. public getter는 필요하지만, setter는 private 하게 만드는 것이 가장 좋다. private 하게 setter를 만드는 방법 backing property 사용하기 custom setter 이용하기 위 2가지 방법 모두 프로퍼티가 많으면 번거로우므로, setter를 열어두되 사용하지 않도록 상호 간의 컨벤션을 지키도록 하는 것도 좋은 방법이다. 생성자 안의 프로퍼티와 클래스 body안의 프로퍼티 반드시 primary constructor 안에 모든 프로퍼티를 넣을 필요는 ..

Ch02. Java 서버를 Kotlin 서버로 리팩토링하자 - Domain 계층 리펙토링하기

Book 도메인 리펙토링 기존 JAVA의 Book 클래스를 지우고, Kotlin코드로 Book을 작성하자 import javax.persistence.Entity import javax.persistence.GeneratedValue import javax.persistence.GenerationType import javax.persistence.Id @Entity class Book( val name: String, @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null, ) { //기본 생성자가 없는 오류가 발생(플러그인을 받으면 오류 해결) init { // 초기화 블록 if (name.isBlank()) { th..

Ch01. 도서관리 애플리케이션 리팩토링 준비하기 - JUnit5으로 Spring Boot 테스트 하기

Controller - Service - Repository - Domain 계층의 테스트하는 방식이 각각 다르다. Controller, Service, Repository는 스프링이 관리하는 bean으로 @SpringBootTest 어노테이션을 붙여서, Domain 은 스프링이 관리하는 bean이 아니므로 단위 테스트(클래스 테스트)를 하면 된다. Controller 같은 경우는 응답받는 JSON을 비롯한 HTTP 위주의 테스트를 하면 된다(응답 코드, 반환 JSON...) Service, Repository는 데이터 위주의 테스트를 진행하면 된다. UserService.createRequest() Test @SpringBootTest //스프링 부트 테스트(빈으로 등록된 객체를 테스트해야되므로) cl..