Scala, Spring-Boot, JPA를 활용한 웹 애플리케이션 개발 과정에 대해 다룬다. Spring-Boot와 JPA 조합만으로도 생산성 있는 웹 애플리케이션 개발이 가능하다. 이 조합만으로도 충분히 의미가 있지만 여기에 Scala라는 약간은 불편한 듯 보이는 언어를 도입함으로써 얻을 수 있는 즐거움을 공유한다. Spring-Boot + JPA 조합에 Scala를 적용하면서의 좌충우돌 경험담을 전한다.
NHN Forward 2018 컨퍼런스에서 발표한 자료입니다.
http://forward.nhnent.com/
MyBatis로 작성된 예제 프로그램을 JPA로 마이그레이션하는 방법에 대해 설명합니다.
cf.) https://github.com/nhnent/hands-on-labs.java.mybatis-to-jpa
자바개발시 모델객체를 생성할 때 setter/getter/toString/hashCode/equals 메소드를 만드는데 이럴 경우 클래스 파일의 소스가 길어지고 복잡해지는데, 이를 해결하기 위해 롬복(Lombok)을 사용하죠, 자바개발 하시는 분이라면 알아두시면 유용하리라 생각 됩니다.
Scala, Spring-Boot, JPA를 활용한 웹 애플리케이션 개발 과정에 대해 다룬다. Spring-Boot와 JPA 조합만으로도 생산성 있는 웹 애플리케이션 개발이 가능하다. 이 조합만으로도 충분히 의미가 있지만 여기에 Scala라는 약간은 불편한 듯 보이는 언어를 도입함으로써 얻을 수 있는 즐거움을 공유한다. Spring-Boot + JPA 조합에 Scala를 적용하면서의 좌충우돌 경험담을 전한다.
NHN Forward 2018 컨퍼런스에서 발표한 자료입니다.
http://forward.nhnent.com/
MyBatis로 작성된 예제 프로그램을 JPA로 마이그레이션하는 방법에 대해 설명합니다.
cf.) https://github.com/nhnent/hands-on-labs.java.mybatis-to-jpa
자바개발시 모델객체를 생성할 때 setter/getter/toString/hashCode/equals 메소드를 만드는데 이럴 경우 클래스 파일의 소스가 길어지고 복잡해지는데, 이를 해결하기 위해 롬복(Lombok)을 사용하죠, 자바개발 하시는 분이라면 알아두시면 유용하리라 생각 됩니다.
Johannes Schlüter's PHPNW08 slides:
The current PHP version, PHP 5.3 introduced a multitude of new language features, most notably namespaces and late static binding, new extensions such as phar, as well as numerous other improvements. Even so, this power-packed release boasts better performance than older PHP releases. This talk will give you a good overview about PHP 5.3 and show some less known features in detail.
Hin síðari ári hafa komið fram lausnir sem varpa gögnum sjálfkrafa í töflugagnagrunna. Þetta er svoköllum Object-Relational Mapping tól. Þar sem slík vörpun er svo algeng þá má nota svo tól til að framkvæma vörpunina sjálfkrafa. Tilvik af klasa í minni er sjálfkrafa varpað á töflu í gunninum. Eitt tól sem gerir þetta er Hibernate og munum við skoða það nánar.
Við skoðum einnig NoSQL grunna en þessir grunnar hafa komið fram með 21. allar vefkerfum sem þurfa að skala yfir mjög margar nóður. Þar hentar Releational grunnurinn illa og önnur módel hafa verið reynd.
Object-Relational Mapping and Dependency InjectionShane Church
Presentation for El Paso County IT on the concepts of Object-Relational Mapping and Dependency injection with a particular focus on the Microsoft Unity DI Container and the Microsoft Entity Framework. Delivered on October 2, 2012.
JDXA is an amazingly simple, flexible, non-intrusive, feature-rich, and lightweight ORM (Object Relational Mapping) product for Android.
JDXA dramatically decreases development time of Android apps by presenting a more intuitive object-oriented view of on-device SQLite data, eliminating the need to write and maintain endless lines of complex low-level SQL code.
한국 표준(?) 자바셋(Java 1.6+Spring 3.x+MyBatis)과 Monolithic 아키텍처를 사용하고 있었던 제 조직 내에서 기술적 변화를 이끌어가는 것에 관련된 내용입니다.
변화를 유도하기 위해서 어떻게 해야 하는지가 핵심이며,
Architecture, Frontend, Backend, 방법론/프로세스의 영역을 각각의 단계로 나누어서 Phase1을 수행한 것과 Phase2를 수행 중인 내용에 대해서도 다룹니다.
Phase1
- Architecture : Frontend / Backend 명시적 분리
- Frontend : Angular.js, Grunt, Bower 도입
- Backend : Java 1.7/Spring4, ORM 도입
- 방법론/프로세스 : Scrum, Git
Phase2
- Architecture : Micro-Service Architecture(MSA)
- Frontend : Content Router, E2E Test
- Backend : Polyglot, Multi-Framework
- 방법론/프로세스 : Scrum+JIRA, Git Branch Policy, Pair Programming, Code Workshop
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
C++11을 시작으로 모던 C++이 도입된 지도 어느새 6년이라는 시간이 흘렀습니다. 올해는 C++17 표준이 도입될 예정입니다. 그만큼 많이 개선되고 새로운 기능들이 많이 도입되었기에 실무에서 사용해보고 싶은 경우도 많습니다. 하지만 이미 서비스 중이라 기존 프로젝트를 새 버전의 VS로 마이그레이션하기 어려운 프로젝트가 많습니다. 그렇다고 아예 불가능한 일도 아닙니다. 이번 세미나에서는 기존 프로젝트를 새 버전의 VS로 마이그레이션하면서 발생했던 문제와 마이그레이션 이후 모던 C++을 사용하면서 발생했던 문제, 그리고 해결법을 설명하고자 합니다. 또한 새 버전의 VS에 생긴 유용한 기능들도 함께 알려드립니다.
Similar to 좌충우돌 ORM 개발기 2012 DAUM DEVON (20)
4. 화면 중심 프로젝트
• 화면 중심으로 프로젝트 구조를 구성
• View 단위로 개발자 투입
• Service, Dao, Entity를 각자 만들어 써야함, 공
유하는 것은 허용하지 않음
5. 회원관리 화면 Package
controller (MemberController)
service (MemberService)
dao (MemberDao)
entity (Member)
상품 관리 화면 Package
controller (ProductController)
service (ProductService)
dao (ProductDao)
entity (Product)
55. 도메인 객체
@Getter @Setter
@Entity
public class Member extends BaseEntity<Long>{
private String name;
private int age;
@OneToMany(mappedBy="member")
List<MemberCard> memberCards = new ArrayList<MemberCard>();
public void addMemberCard(MemberCard memberCard) {
memberCards.add(memberCard);
}
}
@Getter @Setter
@Entity
public class Card extends BaseEntity<Long>{
private String name;
private int rate; //적립률
//create
public CardPoint createCardPoint(int money) {
return new CardPoint(name,money,rate);
}
}
56. @Getter @Entity
public class MemberCard extends BaseEntity<Long>{
@OneToMany(cascade=CascadeType.PERSIST) @JoinColumn(name="memberCard_id")
private List<CardPoint> cardPoints = new ArrayList<CardPoint>();
@ManyToOne private Member member;
@ManyToOne private Card card;
//BIZ
public void payMoney(int money) {
CardPoint createCardPoint = card.createCardPoint(money);
addCardPoint(createCardPoint);
}
//VIEW Logic
public int getTotalPoint() {
int totalPoint = 0;
for (CardPoint cardPoint : cardPoints) {
totalPoint += cardPoint.getPoint();
}
return totalPoint;
}
}
57. 회원 조회, QueryDSL
@RequestMapping("member/home")
public String home(MemberCond cond, Model model) {
//QUERY DSL
QMember qMember = QMember.member;
BooleanExpression containsName = qMember.name.contains(cond.getName());
BooleanExpression gtAge = qMember.age.gt(cond.getAge());
model.addAttribute("members",memberRepository.findAll(containsName.and(gtAge)));
return "member/home";
} public interface MemberRepository extends
JpaRepository<Member, Long>, QueryDslPredicateExecutor<Member>{
}
select * from Member member
where (member.name like '%서%') and member.age > 26
58. 회원 등록, SpringDataJPA
@RequestMapping("member/saveMember")
public String saveMenu(Member member) {
memberRepository.save(member);
return "redirect:/member/home";
}
public interface MemberRepository extends
JpaRepository<Member, Long>, QueryDslPredicateExecutor<Member>{
}
`
62. 회원카드 결제하기 = ORM 저장
@RequestMapping("memberCard/payMoney")
public String payMoney(
@RequestParam("memberCardId") MemberCard memberCard,
@RequestParam("money") int money) {
memberCardService.payMoney(memberCard, money);
return "redirect:/memberCard/home";
}
@Service
@Transactional
public class MemberCardService {
public void payMoney(MemberCard memberCard, int money) {
memberCard.payMoney(money);
}
}
public class MemberCard {
@OneToMany(cascade=CascadeType.PERSIST) @JoinColumn(name="memberCard_id")
private List<CardPoint> cardPoints = new ArrayList<CardPoint>();
public void payMoney(int money) {
CardPoint createCardPoint = card.createCardPoint(money);
cardPoints.add(createCardPoint);
}
public class Card{
private String name;
private int rate;
public CardPoint createCardPoint(int money) {
return new CardPoint(name,money,rate);
}
}
Auto SAVE
`
`
63. Spring-Data-JPA 소개
• interface로 Repository 자동 생성
(CRUD, 조회)
• simple queries
ex) findByName(String name)
select * from member where name={name}
• pagination
• Web Binding
• Specifications, QueryDSL지원
69. • Domain Model을 모든 Layer에서 적극 사용
하자.
• OSIV(Open Session InView) 사용
• Getter, Setter 사용
• DTO는 중복 악마다!
Domain Model
Everywhere
70. • 장점
• 개발하기에 빠르고 편리함
• 단점
• 복잡한View 표현 힘듬
• Domain Model의 Getter, Setter를 노출,View로직 추가
• Domain Model의 순수성이 떨어짐
• XML, JSON, 외부와의 통신API 위험 = 도메인 모델은 생각보다
자주 변함
Domain Model
Everywhere
78. Pure Domain Model
잡종
이런 잡종 구조는 새로운 함수는 물론이고 새로
운 자료 구조도 추가하기 어렵다.
양쪽 세상에서 단점만 모아 놓은 구조다. 그러므
로 잡종 구조는 되도록 피하는 편이 좋다.
- Clean Code, Chapter 6 객체와 자료구조 -
95. • Domain Driven Design
• Pure Domain Model 을 유지하며 실용적으로
개발하는 방법
• DTO를 생성하는 방법, 활용법
• ex) http://modelmapper.org/
• ex) Builder Pattern
우리의 과제
96. • 이터너티님의 블로그(http://aeternum.egloos.com)
• 백기선님 블로그 (http://whiteship.me)
• 이미 2005년에 작성된 토비님의 아티클
Domain Model vs. DTO : http://toby.epril.com/?p=99
• 실전 코드가 있는 자바지기님의 DTO에 관한 최근 아
티클 : http://www.slipp.net/wiki/pages/viewpage.action?pageId=2031636
• Javacan님의 DDD 발표자료 : http://javacan.tistory.com/entry/DDD-
%EC%8C%A9%EA%B8%B0%EC%B4%88-%EC%84%B8%EB%AF%B8%EB%82%98-%EB%B0%9C%ED%91%9C-%EC%9E%90%EB%A3%8C
좋은 자료
97. • Clean Code (Chapter 6 객체와 자료 구조)
• http://codebetter.com/gregyoung/
2010/02/16/cqrs-task-based-uis-event-
sourcing-agh/
• http://martinfowler.com/bliki/CQRS.html
참고
115. 뚱뚱한 Service
회원ENTITY
BIZ LOGIC
View A
View B
View C
회원DTO
+ViewA로직
+ViewB로직
+ViewC로직
View D 회원관리DTO
+ViewD로직
회원Service
+회원등록()
+회원수정()
+회원탈퇴()
+getMemberDTO()
+getMemberManageDTO()
...DTO()
그래 나 뚱뚱하다!
118. 뚱뚱한 Service
회원ENTITY
BIZ LOGIC
View A
View B
View C
회원DTO
+ViewA로직
+ViewB로직
+ViewC로직
View D 회원관리DTO
+ViewD로직
회원Service
+회원등록()
+회원수정()
+회원탈퇴()
+getMemberDTO()
+getMemberManageDTO()
...DTO()
그래 나 뚱뚱하다!
119. 뚱뚱한 Service
회원ENTITY
BIZ LOGIC
View A
View B
View C
회원DTO
+ViewA로직
+ViewB로직
+ViewC로직
View D 회원관리DTO
+ViewD로직
회원CommandService
+회원등록()
+회원수정()
+회원탈퇴()
회원
QueryService+getMemberDTO
()
+getMemberManageDTO()
...DTO()