CS
스프링 기본 - 섹션1 객체 지향 설계와 스프링
먼 옛날 EJB라는 현재의 스프링과 같은 기능을 했지만 너무 복잡하고 성능도 안나오는 지옥시절이 있었다. 이게 너무 불편해서 순수 자바로 돌아가서 다시 스프링 만들었다. 알맹이는 스프링 프레임워크. 여기 안에 모든 핵심 기술들 다 들어가 있는 거고 부트는 도와주는 역할(패키지 매니저, 서버 열어주기 등). 스프링이 왜 좋나면 객체지향의 강점을 최대로 이끌어 내는거고, 객체지향이 좋은 이유는 다형성(Polymorphism) 때문임. 흔히 예시로 드는 자동차인데 한 0.2초정도 아하 하고 이해한듯 하다가 다시 의문을 가지는 예시다. 객체지향이 왜 좋은지 모르겠다면, 반대로 안쓰고 함수만을 써서 한다고 생각해보자. 위 자동차 예시는 이제 핸들 위치, 페달 위치 그런게 interface로 함수 이름 등이 정해져..
스프링 입문 - 섹션7 AOP
@Component @Aspect public class TimeTraceAop { @Around("execution(* hello.hellospring..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); System.out.println("START: " + joinPoint.toString()); try { return joinPoint.proceed(); } finally { long finish = System.currentTimeMillis(); long timeMs = finish - start; System.out.printl..
스프링 입문 - 섹션6 스프링 DB 접근 기술
이 섹션 강의 목차는 이렇다. 물론 내가 볼거라 대충 쓸거임 - H2 데이터베이스 설치 - 순수 Jdbc - 스프링 통합 테스트 - 스프링 JdbcTemplate - JPA - 스프링 데이터 JPA H2 데이터베이스 설치는 별거 없고 resources의 application에 datasource로 연결해준다는 것만 알면 된다. 순수 Jdbc이전에, Jdbc는 자바랑 데이터베이스랑 connect만 해주는거라 안의 세부 내역은 직접 매핑을 해줘야 한다. sql문 짜서 결과 나오면 그걸 내 클래스 멤버의 어디에 대입해주고.. 하는거. 사용하기엔 너무 옛날 기술이라 이제 안쓰지만 이런게 세부적으로 작성된다는 것 정도는 알고 있어야 이해할 수 있다. configure로 설정 변경해주고 다음에 구체적인 과정을 작성..
스프링 입문 - 섹션4 스프링 빈과 의존관계
일단 의존관계가 뭐고 왜 나오는지 부터 생각하자. public class MemberService { MemberService memberService = new MemberService(); MemoryMemberRepository memberRepository = new MemoryMemberRepository(); // ... } 서비스에서 레퍼지토리 객체를 직접 만드는 식으로 하면, 다른 서비스에서도 새로 만들면 서로 다른 데이터베이스(레퍼지토리)를 볼 수 있는 일이 생긴다. 그래서 꼬일 수 있으니 하나만 보게 하기 위함. 또 어차피 같은 일을 하니 하나만 만들어서 계속 쓰는 의미도 있음. 이를 싱글톤이라고 함. 의존관계는 해당 기능을 원하는 클래스가 그 클래스의 인스턴스를 주입 받아서 사용하는 ..
만든 이유
https://www.youtube.com/watch?v=ZgtvcyH58ys 김영한님 강의라고 하면 다 엄청좋다고 하는데 블라인드 힙스터들은 "국비충 특: 블로그 김영한 강의" 이러면서 놀리고 안좋은 시선으로 본다. 난 자바를 싫어해서 억지로 다른걸 하려고 했지만.. 나도 이제 인정하고, 사람들이 많이 하는데는 이유가 있고, 토이프로젝트로 만들어봤지만 깊이가 없었다. 엘리트분들은 언어는 중요하지 않고 실력이 중요하다고 했지만.. 난 엘리트가 아니다. 취업 풀도 파이썬은 별로 없고 선택권도 많지 않다. 나한텐 언어가 중요하다. 최종목표도 자바를 쓰고 있고. 난 내가 잘한다고 생각한 적이 한번도 없다. 가끔 자뻑할때가 있었겠지만 딱 그정도고..
부록 E. 코루틴과 Async/Await
https://kotlinlang.org/docs/coroutines-guide.html Coroutines guide | Kotlin kotlinlang.org https://speakerdeck.com/taehwandev/kotlin-coroutines Kotlin coroutines Jetbrains day in seoul 2018 speakerdeck.com 비동기는 알면 유용하게 쓰인다... 코루틴은 원래 코틀린 기능이 아니었지만 1.3버전에서 정식 채용된 플러그인. # 수도코드 generator countdown(n) { while(n>0) { yield(n) n -= 1 } } for i in countdown(10) { println(i) } yield를 실행해서 실행하던걸 멈추고 메인루틴..
11. DSL 만들기
11장에서 다루는 내용 - 영역 특화 언어 만들기 - 수신 객체 지정 람다 사용 - invoke 관례 사용 - 기존 코틀린 DSL 예제 확장함수를 사용해서 함수를 자연어처럼 쓰는건 멋지긴 한데... 잘 안쓸것 같다. 근데 이것이 진짜 코틀린처럼 쓰는거라며 언어 제작자가 미는 느낌. 나중에 쓰게 된다면 그때 자세히 보는걸로 11.1 API에서 DSL로 일반 구문 간결한 구문 사용한 언어 특성 StringUtil.capitalize(s) s.capitalize() 확장 함수 1.to("one") 1 to one 중위 호출 set.add(2) set += 2 연사자 오버로딩 map.get("key") map["key"] get 메서드에 대한 관례 file.use({ f -> f.read() }) file.us..
10. 애노테이션과 리플렉션
(잘 이해가 안되서 이해한 부분 위주로만 작성한다. 나중에 코틀린에 익숙해지면 다시 읽고 오자) 10장에서 다루는 내용 - 애노테이션 적용과 정의 - 리플렉션을 사용해 실행 시점에 객체 내부 관찰 - 코틀린 실전 프로젝트 예제 실전 프로젝트란 https://github.com/yole/jkid GitHub - yole/jkid: JSON serialization/deserialization library for Kotlin data classes JSON serialization/deserialization library for Kotlin data classes - GitHub - yole/jkid: JSON serialization/deserialization library for Kotlin dat..
9. 제네릭스
9장에서 다루는 내용 - 제너릭 함수와 클래스를 정의하는 방법 - 타입 소거와 실체화한 타입 파라미터 - 선언 지점과 사용 지점 변성 기본적인 제너릭 개념과 타입끼리도 상하 관계가 있고, 함수 내에서만 자식용으로 쓰인다던지 역전된다던지 하는 아주 개판이다. 클래스를 많이 다뤄야지 이해할 수 있고 의미가 있는 장인 것 같다. 나중에 다시 와서 읽으라고 9.1 제너릭 타입 파라미터 는 자바와 비슷한 개념임. val readers1: MutableList = mutableListOf() val readers2 = mutableListOf() 위의 두 코드는 같다. 안에 element를 쥐어주면 컴파일러가 알아서 타입을 추론하지만, 빈 리스트일 경우는 추론할 만한게 없다보니 직접 타입을 지정해줘야 한다. 제너릭..
8. 고차 함수: 파라미터와 반환 값으로 람다 사용
8장에서 다루는 내용 - 함수타입 - 고차 함수와 코드를 구조화할 때 고차 함수를 사용하는 방법 - 인라인 함수 - 비로컬 return과 레이블 - 무명 함수 함수의 인자로 함수를 넘길 수 있는것과 람다에 대해 좀 더 알아보는 장이다. 8.1 고차 함수 정의 함수도 변수마냥 타입 지정해서 넘길 수 있다. 주로 람다 사용하는게 편해서 람다를 넘기는 거고. fun twoAndThree(operation: (Int, Int) -> Int) { val result = operation(2, 3) println("The result is $result") } twoAndThree { a, b -> a + b } // The result is 5 twoAndThree { a, b -> a * b } // The r..