
햄버거 클래스를 만든다고 생각해보자. 이번 예제부터는 코틀린으로 작성해보려한다. 자바랑 좀 다르긴 하지만 이해하는데 큰 어려움을 없을거라고... 생각한다..... open class Hamburger(private val bun: String, private val patty: String) { open fun materials(): String = "$bun $patty" } 기본 햄버거다. 햄버거 번과 패티를 갖고있다. message() 메서드는 그저 재료들을 나열하는 문자열을 반환하는 간단한 클래스다. 치즈토핑이 추가된 치즈버거를 만들고싶다. 어떻게 구현할 수 있을까? open class CheeseBurger(private val cheese: String, bun: String, patty: S..
generic 을 이용한 배열 객체를 생성할때는 컴파일단에서 에러가 발생하게된다. List[] lists = new ArrayList[10]; ArrayList 의 배열을 만들고자하는 코드다. 대충 쉽게 이해하면 일종의 2차원 배열이라고 볼 수 있다. 하지만 이 코드는 'generic array creation' 이라는 컴파일 에러와 함께 컴파일 되지않는다. 왜 이럴까? 먼저 제네릭이 추구하는 바가 뭔지를 알아보고, 배열과 제네릭 리스트의 차이를 이해해야 컴파일러가 저걸 왜 막는지 이해할 수 있다. 제네릭이 추구하는 바는 타입 안정성이다. 제네릭이 사용된 코드는 타입 안정성을 보장해야한다. 타입 안정성이 보장될 수 없다면 제네릭은 사용될 이유가 없다. 그런데 배열과 제네릭의 차이점으로 인해 제네릭 배열은..

1. 축구경기 국가대표 축구경기가 있다고 생각해보자. 골이 들어갈때마다 네이버와 다음 각 포털의 데이터가 변경되어야한다. 이를 어떻게 구현하면 될까? 첫번째 방법은 담당자가 축구를 보다가 골이 들어갈때마다 데이터를 변경해주는 수동 방법이있다. 수동방법을 몰라서 이 포스팅을 하는건 아니니 넘어가자. 두번째 방법은 축구협회에서 현재 골득점 상황을 알려주는 API를 제공한다고 가정했을때(제공안해주면 크롤링을 해서라도..), 각 포털사가 지속적으로 API를 호출하면서 데이터 변경 유무를 체크하는 방법이 있을 수 있다. 이 방식으로 구현하면 적어도 담당자가 직접 수작업은 하지않아도 되니 자동화가 가능해진다. 다만 축구협회 API를 호출하는 주기를 어떻게 잡을것인지가 중요하다. 너무 짧게 잡으면 축구협회 API에 ..

1. 코드 스멜 게임을 만든다고 생각해보자. 각각의 몬스터들을 객체로 만드려고한다. 객체를 만드려면 일단 클래스가 있어야하니 클래스를 정의하자. public abstract class Monster { public abstract void attack(); } 몬스터들간의 다형성을 위해 Monster 추상 클래스를 정의했다. 이번 포스팅은 attack() 메서드부분을 리팩토링해나가는 과정을 작성하려한다. 그래서 메서드는 attack() 만 간단하게 정의했다. public class Knight extends Monster { @Override public void attack() { System.out.println("칼 공격!"); } } Knight 몬스터를 정의했다. Knight 몬스터 외에 Ske..
이펙티브자바를 보던중 평소에 잘 모르는 상태로 혼용하고있던 네이밍 컨벤션에 대해 잘 설명해주고있어 정리한다. from: 하나의 매개변수를 받아서 인스턴스를 생성 of: 여러개의 매개변수를 받아서 인스턴스를 생성 instance or getInstance: 인스턴스를 반환하지만 동일한 인스턴스임을 보장하지 않는다. 보통 singleton을 구현할때 많이 사용하는 네이밍이지만 singleton이랑은 무관하게 매번 신규 생성될 수 있다. create or newInstance: 매번 새로운 인스턴스를 반환한다. instance or getInstance 의 서브셋 개념이라고 볼 수 있을듯 getXxxx: getInstance와 같으나 호출하는 클래스와 다른 타입의 인스턴스를 반환할때 사용 예를들어 Date.g..
ParallelStream java8에 추가된 parallelStream 은 멀티스레드 프로그래밍을 매우 쉽게 해준다. 개발자가 직접 스레드 혹은 스레드풀을 생성하거나 관리할 필요없이 parallelStream(), parallel() 만 사용하면 알아서 ForkJoinFramework 를 이용하여 작업들을 분할하고, 병렬적으로 처리하게된다. public static void main(String[] args) { parallel(); single(); } private static void parallel() { long start = System.currentTimeMillis(); long sum = LongStream.range(0, 1_000_000_000).parallel() .sum(); S..
spring bean 설정시 lite mode 라는게 있어서 찾아보고, 그에대해 정리해보려한다. 일단 lite mode 는 java 설정에서만 사용할 수 있다. 보통의 java 설정파일을 알아보자. @Configuration public class BeanConfig1 { @Bean public ObjectMapper objectMapperBean() { return new ObjectMapper(); } }평소에 많이 사용하는 java 설정 내용이다. @Bean 애노테이션을 이용해 spring bean 을 생성한다. 그리고 이 java 클래스가 설정 클래스임을 나타내기위해 @Configuration 애노테이션을 사용한다. @Configuration 애노테이션은 설정 클래스임을 나타내며 그 자신도 spr..
1. 명사를 사용하고, 동사는 사용하지 말라 이해하기 쉽게 모든 리소스에 대해 아래 구조를 사용하라 Resource GET read POST create PUT update DELETE /cars Returns a list of cars Create a new car Bulk update of cars Delete all cars /cars/711 Returns a specific car Method not allowed (405) Updates a specific car Deletes a specific car 동사는 사용하지마라 /getAllCars /createNewCar /deleteAllRedCars 2. GET 메서드와 쿼리 파라미터로 상태를 변경하면 안된다 상태를 변경하려면 GET 메서드 대..

요근래 kotlin+spring boot2 로 개발을 하고있다. 이중에 코드를 리팩토링하고싶은 부분이 있었고, 이를 리팩토링하는 과정에서 꽤나 삽질을 하게만든 경험을 포스팅하려한다. 뭔가 특정한 내용에 대해 포스팅한다기보다 실제 상황에서 이슈를 만나고, 그 이슈를 해결해가는 과정을 남겨보려한다. 실제 이슈는 회사에서 프로덕션 코드를 리팩토링하는 과정에서 발생한부분이고, 포스팅에서 나오는 코드는 해당 코드를 예제화한 코드이다. 참고로 아래 예제코드를 위한 개발환경은 다음과같다. - kotlin - spring boot 2.1.5 - spring boot stater web - spring boot starter jdbc (필수) 1. 코드작성 abstract class BaseApiRepository(pr..
빠르게 알아보자. 포스팅은 gradle 기준으로 설명한다. build.gradle에 아래 설정을 추가해준다. test { useJUnitPlatform() } spring starter test 에서 기존 junit을 제외해준다. dependencies에서 아래처럼 설정해준다. testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude module: 'junit' } 이제 junit5 의존성을 추가해줄차례다. testImplementation('org.junit.jupiter:junit-jupiter-api') testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') 위 ..
- Total
- Today
- Yesterday
- javascript
- generics
- EffectiveJava
- frontcode
- code
- toby
- TEST
- Kotlin
- OOP
- frontend개발환경
- Jackson
- JPA
- Spring
- servlet
- DesignPattern
- clean code
- mariadb
- programming
- http
- Git
- backend개발환경
- db
- JavaScript Core
- java
- go-core
- Design Pattern
- MySQL
- spring cloud
- 정규표현식
- java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |