Scala, Spring-Boot, JPA를 활용한 웹 애플리케이션 개발 과정에 대해 다룬다. Spring-Boot와 JPA 조합만으로도 생산성 있는 웹 애플리케이션 개발이 가능하다. 이 조합만으로도 충분히 의미가 있지만 여기에 Scala라는 약간은 불편한 듯 보이는 언어를 도입함으로써 얻을 수 있는 즐거움을 공유한다. Spring-Boot + JPA 조합에 Scala를 적용하면서의 좌충우돌 경험담을 전한다.
Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안SANG WON PARK
Apache Kafak의 빅데이터 아키텍처에서 역할이 점차 커지고, 중요한 비중을 차지하게 되면서, 성능에 대한 고민도 늘어나고 있다.
다양한 프로젝트를 진행하면서 Apache Kafka를 모니터링 하기 위해 필요한 Metrics들을 이해하고, 이를 최적화 하기 위한 Configruation 설정을 정리해 보았다.
[Apache kafka 모니터링을 위한 Metrics 이해 및 최적화 방안]
Apache Kafka 성능 모니터링에 필요한 metrics에 대해 이해하고, 4가지 관점(처리량, 지연, Durability, 가용성)에서 성능을 최적화 하는 방안을 정리함. Kafka를 구성하는 3개 모듈(Producer, Broker, Consumer)별로 성능 최적화를 위한 …
[Apache Kafka 모니터링을 위한 Metrics 이해]
Apache Kafka의 상태를 모니터링 하기 위해서는 4개(System(OS), Producer, Broker, Consumer)에서 발생하는 metrics들을 살펴봐야 한다.
이번 글에서는 JVM에서 제공하는 JMX metrics를 중심으로 producer/broker/consumer의 지표를 정리하였다.
모든 지표를 정리하진 않았고, 내 관점에서 유의미한 지표들을 중심으로 이해한 내용임
[Apache Kafka 성능 Configuration 최적화]
성능목표를 4개로 구분(Throughtput, Latency, Durability, Avalibility)하고, 각 목표에 따라 어떤 Kafka configuration의 조정을 어떻게 해야하는지 정리하였다.
튜닝한 파라미터를 적용한 후, 성능테스트를 수행하면서 추출된 Metrics를 모니터링하여 현재 업무에 최적화 되도록 최적화를 수행하는 것이 필요하다.
넥슨코리아 사내 발표자료로 왓 스튜디오에서 파이썬으로 《야생의 땅: 듀랑고》 서버를 비롯한 여러가지 도구를 만든 경험을 공유합니다.
- 게임서버와 각종 툴, 테스트/빌드/배포 시스템을 만들 때 사용한 재료
- 파이썬 코드 품질 개선, 디버깅, 프로파일링, 최적화
- 파이썬 오픈소스 생태계와 왓 스튜디오가 하는 오픈소스 활동
Exactly-once Stream Processing with Kafka StreamsGuozhang Wang
The document discusses exactly-once stream processing using Kafka Streams, focusing on key concepts such as error scenarios, idempotence, and transactions. It highlights how Kafka Streams simplifies achieving exactly-once processing, even in the presence of failures, and provides coding examples for implementing stream processing. The presentation also emphasizes the importance of exactly-once processing in stream applications and the enhancements introduced in Kafka version 0.11+.
[우리가 데이터를 쓰는 법] 모바일 게임 로그 데이터 분석 이야기 - 엔터메이트 공신배 팀장Dylan Ko
Gonnector(고넥터) 고영혁 대표가 주최한 스타트업 데이터 활용 세미나 '우리가 데이터를 쓰는 법' 의 세 번째 발표 자료
세미나 : 우리가 데이터를 쓰는 법 (How We Use Data)
일시 : 2016년 4월 12일 화요일 10:00 ~ 18:00
장소 : 마루180 (Maru180) B1 Think 홀
제목 : 모바일 게임 로그 데이터 분석 이야기
연사 : 엔터메이트 공신배 팀장
고승범(peter.ko) / kakao corp.(인프라2팀)
---
카카오에서는 빅데이터 분석, 처리부터 모든 개발 플랫폼을 이어주는 솔루션으로 급부상한 카프카(kafka)를 전사 공용 서비스로 운영하고 있습니다. 전사 공용 카프카를 직접 운영하면서 경험한 트러블슈팅과 운영 노하우 등을 공유하고자 합니다. 특히 카프카를 처음 접하시는 분들이나 이미 사용 중이신 분들이 많이 궁금해하는 프로듀서와 컨슈머 사용 시의 주의점 등에 대해서도 설명합니다.
Google Cloud Platform monitoring with ZabbixMax Kuzkin
The document is a guide on using Zabbix for monitoring on Google Cloud Platform, detailing the terminology, operations, and configurations necessary for effective monitoring. It discusses key metrics, external checks, and the Google Monitoring API v3 capabilities. Additionally, it provides instructions for setting up external scripts and configuring Zabbix to track HTTP response statuses and other metrics from Google Cloud services.
넥슨코리아 사내 발표자료로 왓 스튜디오에서 파이썬으로 《야생의 땅: 듀랑고》 서버를 비롯한 여러가지 도구를 만든 경험을 공유합니다.
- 게임서버와 각종 툴, 테스트/빌드/배포 시스템을 만들 때 사용한 재료
- 파이썬 코드 품질 개선, 디버깅, 프로파일링, 최적화
- 파이썬 오픈소스 생태계와 왓 스튜디오가 하는 오픈소스 활동
Exactly-once Stream Processing with Kafka StreamsGuozhang Wang
The document discusses exactly-once stream processing using Kafka Streams, focusing on key concepts such as error scenarios, idempotence, and transactions. It highlights how Kafka Streams simplifies achieving exactly-once processing, even in the presence of failures, and provides coding examples for implementing stream processing. The presentation also emphasizes the importance of exactly-once processing in stream applications and the enhancements introduced in Kafka version 0.11+.
[우리가 데이터를 쓰는 법] 모바일 게임 로그 데이터 분석 이야기 - 엔터메이트 공신배 팀장Dylan Ko
Gonnector(고넥터) 고영혁 대표가 주최한 스타트업 데이터 활용 세미나 '우리가 데이터를 쓰는 법' 의 세 번째 발표 자료
세미나 : 우리가 데이터를 쓰는 법 (How We Use Data)
일시 : 2016년 4월 12일 화요일 10:00 ~ 18:00
장소 : 마루180 (Maru180) B1 Think 홀
제목 : 모바일 게임 로그 데이터 분석 이야기
연사 : 엔터메이트 공신배 팀장
고승범(peter.ko) / kakao corp.(인프라2팀)
---
카카오에서는 빅데이터 분석, 처리부터 모든 개발 플랫폼을 이어주는 솔루션으로 급부상한 카프카(kafka)를 전사 공용 서비스로 운영하고 있습니다. 전사 공용 카프카를 직접 운영하면서 경험한 트러블슈팅과 운영 노하우 등을 공유하고자 합니다. 특히 카프카를 처음 접하시는 분들이나 이미 사용 중이신 분들이 많이 궁금해하는 프로듀서와 컨슈머 사용 시의 주의점 등에 대해서도 설명합니다.
Google Cloud Platform monitoring with ZabbixMax Kuzkin
The document is a guide on using Zabbix for monitoring on Google Cloud Platform, detailing the terminology, operations, and configurations necessary for effective monitoring. It discusses key metrics, external checks, and the Google Monitoring API v3 capabilities. Additionally, it provides instructions for setting up external scripts and configuring Zabbix to track HTTP response statuses and other metrics from Google Cloud services.
SLiPP(https://slipp.net) 서비스를 Java에서 Scala로 전환하는 과정에 대해 살펴본다. Scala를 선택한 이유, Java와 Scala를 동시에 서비스하면서 점진적으로 리팩토링하는 과정, Scala + Spring 기반으로 개발할 때 고려사항, Java에서 Scala로 전환하는 과정에 대한 경험담을 공유한다.
NHN Forward 2018 컨퍼런스에서 발표한 자료입니다.
http://forward.nhnent.com/
MyBatis로 작성된 예제 프로그램을 JPA로 마이그레이션하는 방법에 대해 설명합니다.
cf.) https://github.com/nhnent/hands-on-labs.java.mybatis-to-jpa
github : https://github.com/arahansa/learnspringdatajpa
스프링 데이터 Jpa 간단한 튜토리얼 입니다. 초보용^^;
스프링 부트, 메이븐..
내용은 간단한 매핑, CRUD, 페이징, 스프링 부트조금.
JPA의 기본 개념에 대해 설명하고 MyBatis로 작성된 애플리케이션을 JPA로 리팩토링하는 과정을 단계별로 살펴봅니다.
목차
1. MyBatis
2. Why JPA?
3. MyBatis to JPA
- JPA 설정
- Entity
- 연관관계 설정
- Repository
- 애플리케이션에서의 사용
대상
- MyBatis를 실무에 사용하고 있으면서 JPA 도입을 고려하고 있는 백엔드 개발자
- JPA를 적용하면서 어려움을 겪었거나 JPA를 실제 적용하는 과정이 궁금한 개발자
개념 위주인 Basic 내용에 이어 '애완동물(spring-petclinic)' 어플리케이션 코드 대상으로 실제 테스트 코드를 작성하고 커버리지를 측정하는 교육입니다. 명세로부터 테스트를 도출하는 블랙박스 테스트 접근 이후, 코드 커버리지 정보로부터 추가 테스트를 작성하는 화이트박스 기법을 차례로 적용하고 있습니다
2014년 3월 29일 NHN NEXT에서 진행한 SORAN 컨퍼런스에서 스터디와 관련해 공유한 내용이다. 이 발표를 위해 작성한 스크립트중 일부를 공유한다.
* 그럼 스터디가 나에게 미친 영향에 대해 이야기해 볼께요.
* 첫 번째는 스터디의 가장 큰 목적인 지식 습득입니다. 정말 많은 지식을 얻을 수 있었어요. 하지만 저에게는 지식 습득이 가장 작다고 느껴집니다.
* 개발자로 살아가다보면 연습하기 힘든 것이 토론 능력인데요. 스터디를 하면서 토론할 기회가 많았어요. 스터디는 정치적인 목적인 없다보니 자연스럽게 토론이 활성화되더라고요. 특정 주제를 가지고 토론하는 재미를 느꼈어요.
* 다음은 저에게 정말 큰 약점 중의 하나였던 발표 능력이 자연스럽게 향상 되더라고요. 스터디원들과 부담 없는 사이가 되고, 실수해도 문제가 되지 않는 상황이다보니 발표하는 부담이 적더라고요. 그렇게해서 스터디 내용을 몇 번 발표했더니 자신감도 생기더라고요. 스터디 시작 후 4개월이 지난 시점에 처음으로 외부 강의를 했던 기억이 납니다.
* 스터디하면서 정말 크게 느낀 것 중의 하나가 혼자 학습하는 것보다 같이 학습하는 것이 훨씬 더 재미있고, 많은 것을 배울 수 있다는 것이였어요. 그 이전까지 혼자 학습하는 것이 익숙했거든요. 우리 대부분이 그렇잖아요.
* 그러면서 자연스럽게 사람들과의 관계에서 느끼는 즐거움을 알게 됐어요. 그 전까지는 머리로만 사람들과 관계를 맺어왔지, 가슴으로 느끼지 못했다고 생각해요. 그런데 스터디라는 순수한 목적으로 만남 사람들과 관계를 맺으면서 가슴으로 친구를 만날 수 있었어요. 아마도 지금 제 아내의 맹목적인 사랑도 큰 영향을 미쳤다고 생각해요.
* 아마 대부분의 사람들은 스터디를 통해 지식을 습득하려는 목적이 강할 겁니다. 하지만 그 보다 다른 부분에 의미를 둔다면 스터디를 더 즐거워질겁니다.
* 다음으로 우리와 스터디에 대해 이야기해볼께요. 우리는 왜 스터디를 해야 할까요?
* SICP라는 책으로 유명한 책입니다. 프로그래밍과 관련해 정말 좋은 내용을 많이 포함하고 있어요. 그런데 이 책 정말 어렵습니다.
* 자바 진영 웹 서비스를 개발하는 경우 대부분의 프로젝트에서 스프링이라는 도구를 활용합니다. 스프링 분야에서 정말 유명한 책입니다. 그런데 정말 두껍니다. 상상을 초월합니다.
* 이런 책을 혼자 시작하면 3분의 1도 읽지 못하고 포기할 가능성이 거의 99%입니다. 하지만 스터디를 통해 같이 한다면 끝까지 읽을 가능성을 80% 이상으로 높일 수 있습니다.
* 스터디는 정말 다양한 실험을 할 수 있는 공간입니다. 이 공간에서는 실패해도 누가 뭐라하지 않습니다. 여러분이 자신 없는 부분이 있다면 일단 스터디를 만들고 실험하세요. 누가 만들기를 기다리지 마세요. 여러분이 직접 만드세요.
* 자기 주도적 학습이 뭐라고 생각하시나요? 정말 많은 곳에서 이야기하죠? 주변 도움 없이 혼자 스스로 공부하면 자기 주도 학습인가요? 스터디를 만들어보세요. 자기 주도적으로 학습하는 다양한 사람들을 만날 수 있어요. 여러분이 지금까지 가지고 있던 생각을 깨는 경우가 많을 겁니다. NEXT 교육 커리큘럼과 교수의 권위에 도전하세요. 저는 이 권위에 도전하는 것이 진정한 자기 주도 학습이라 생각합니다.
* 이 말이 말이 된다고 생각하세요? 배움이 고통이 아니라 즐거움이라니요. NEXT에서 학생들과 진행한 스터디에서
12. JPA
• 단순, 반복적인 CRUD 작업하기 싫다.
• 스키마 변경에 따른 비용을 최소화하고 싶다.
• 핵심 비즈니스 로직에 집중하고 싶다.
13. JPA 도입에 따른 더 큰 효과
요구사항이 자주 변경되는 프로젝트 초반, 빠른 사이클로 설계에
대해 다양한 실험이 가능하다.
14. JPA를 사용하지 않는 경우 – 테이블 최초 생성시
데이터베이스에 스키마 적용
비즈니스 로직 구현 테이블 설계
테이블 스키마 생성SQL 쿼리 구현
자바 테이블과 매핑되는 객체 추
가
1
2
34
5
6
15. JPA를 사용하지 않는 경우 – 테이블 스키마 변경시
데이터베이스에 스키마 적용
비즈니스 로직 변경(선택)
테이블 설계
테이블 스키마 변경
칼럼 변경에 따른 SQL
쿼리 수정
자바 객체에 필드 변경
16. 비즈니스 로직 구현 객체 설계
JPA를 사용하는 경우 – 객체(Entity) 최초 생성시
객체 추가 및 매핑
데이터베이스에 스
키마 적용
비즈니스 로직 구현 테이블 설계
테이블 스키마 생성SQL 쿼리 구
현
자바 테이블과 매핑되
는 객체 추가
1
2
3
17. 비즈니스 로직 구현(선
택)
객체 설계
JPA를 사용하는 경우 – 객체(Entity) 필드 변경
객체 필드 변경
데이터베이스에 스키마
적용
비즈니스 로직 변경(선택)
테이블 설계
테이블 스키마 변경칼럼 변경에 따른
SQL 쿼리 수정
자바 객체에 필드 변경
18. JPA 도입 효과
• 요구사항이 자주 변경되는 프로젝트 초반 빠른 구현 – 피드백 사이
클
• 빠른 피드백 사이클은 삽질할 수 있는 시간을 확보함으로써 빠른 지식
축적이 가능하다.
• 지식 축적은 도메인에 최적화된 설계를 할 수 있도록 한다.
• 좋은 설계는 사용자의 요구사항 변화에 빠르게 대응할 수 있다.
• 개발자는 소스 코드에 대한 자부심과 여유 시간을 확보할 수 있다.
22. 1. @IntegrationTest
• Spring Boot는 Embedded Tomcat 기반으로 동작.
• @IntegrationTest 기반으로 테스트하면 Embedded Tomcat을 자동
실행한 후 Client 테스트가 가능.
• 특히 RestTemplate을 활용해 API 테스트할 때 유용.
28. 제공하는 정보
• Spring 관련 정보
• /autoconfig – Spring auto configuration 정보
• /beans - Spring Bean 목록
• /configprops - @ConfigurationProperties 정보
• /mappings - @RequestMapping 정보
• 시스템 운영 및 성능
• /dump – thread dump
• /health – 애플리케이션의 정상 동작 유무
• /metrics – 애플리케이션의 메모리 상태, heap, thread 등과 관련한 정보 제공
• http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-
ready 에서 추가 정보 확인
35. Scala
• 10년 이상 Java만 했더니 재미없더라.
• 2년 정도 함수형 언어로 Scheme, Clojure 도전했다가 중도 포기
• 어딘가 직접적으로 활용하고 있지 않으면 동기부여가 잘 되지 않는
성격
36. 1. Domain과 DTO의 명확한 분리에 대한 거부감이
줄어듦
• 현재 개발 추세는 Domain 객체와 DTO에 중복되는 부분이 많아 자바
객체 하나가 Domain 역할, DTO 역할을 하는 방식으로 구현.
• Scala를 활용하면 각 역할별로 구현하는 것에 대한 거부감이 줄어듦
37. @Entity
class User(pEmail: String, pNickName: String, pPassword: String) extends
DomainModel {
@Id
@GeneratedValue
var id: Long = _
@Column(unique = true, nullable = false)
val email = pEmail
@Column(name = "nick_name", nullable = false)
val nickName = pNickName
@Column(nullable = false)
val password = pPassword
def isGuest(): Boolean = {
false
}
}
User Entity
• 반드시 setter/getter를 생성하지 않아도 된다.
38. @JsonIgnoreProperties(ignoreUnknown = true)
@JsonPropertyOrder(alphabetic = true)
@JsonInclude(Include.NON_NULL)
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility =
Visibility.NONE, setterVisibility = Visibility.NONE)
trait View
case class UserView(id: Long, email: String, nickName: String) extends
View {
def this(u: User) = this(u.id, u.email, u.nickName)
def this() = this(new User())
}
User View DTO
• Scala case class를 활용하면 자동으로 field 추가함.
39. class UserForm {
@BeanProperty
@Email
var email: String = _
@BeanProperty
@NotNull
@Size(min = 3, max = 10)
var nickName: String = _
@BeanProperty
@NotNull
@Size(min = 8, max = 15)
var password: String = _
def toUser() = new User(email, nickName,
password)
}
User Form DTO
• @BeanProperty 활용하면 setter/getter method 자동
추가
40. Domain과 DTO의 명확한 분리에 대한 거부감이
줄어듦
• 분리하는 것이 항상 좋은 것은 아니다.
• 상황에 따라 Entity와 DTO를 분리/통합할 것인지에 대한
역량을 키우는 것이 더 중요하다.
41. 2. Test Fixture(Test Data) 생성하기 용이함.
• 자바에서 Test Fixture를 생성하고 변경하기 어려움은 Test 코드를
만드는데 약간의 장애물이다.
• Scala는 named parameter를 통해 해결 가능
43. public class UserBuilder {
private String email;
private String nickname;
private String password;
public UserBuilder withEmail(String email) {
this.email = email;
return this;
}
public UserBuilder withNickname(String nickname) {
this.nickname = nickname;
return this;
}
public UserBuilder withPassword(String password) {
this.password = password;
return this;
}
public User build() {
return new User(email, nickname, password);
}
}
44. public class UserTest {
@Test
public void canCreate() throws Exception {
User user1 = new UserBuilder().withEmail("[email protected]").build();
User user2 = new
UserBuilder().withEmail("[email protected]").withNickname("newname").build();
}
}
22장. 복잡한 테스트 데이터 만들기 참고
45. trait Fixture {
def aSomeUser(email: String = "[email protected]", nickname: String = "nickName", password:
String = "password")
= new User(email, nickname, password)
}
val user1 = aSomeUser
val user2 = aSomeUser(email="[email protected]")
val user1 = aSomeUser(nickName="newname")
46. 3. implicit을 활용한 중복 제거
• 애플리케이션을 구현하다보면 반복적으로 전달하는 인자가 존재함.
• Scala의 implicit을 활용해 제거 가능