75
Spring Scala 만났을 때 스프링스칼라Outsider 2013.10.13 at SpringCamp 2013 with Scala

Spring Scala : 스프링이 스칼라를 만났을 때

Embed Size (px)

DESCRIPTION

Springcamp 2013 with Scala에서 발표한 발표자료

Citation preview

Page 1: Spring Scala : 스프링이 스칼라를 만났을 때

Spring Scala

만났을 때

스프링이스칼라를

Outsider2013.10.13 at SpringCamp 2013 with Scala

Page 2: Spring Scala : 스프링이 스칼라를 만났을 때

Outsider@[email protected]

코딩을 좋아하는 프로그래머봄싹, 라 스칼라 코딩단, FRENDS 등에서 활동다양한 기술에 관심 많음http://blog.outsider.ne.kr/ 블로그 운영

Page 3: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라로스프링 프레임워크를

사용할 수 있는가?

이 발표에서는

Page 4: Spring Scala : 스프링이 스칼라를 만났을 때

- 스프링 스칼라가 어떤 기능을 지원하는가?

- 실제로 스칼라에서 스프링을 사용할 때는 어떤 이슈가 있는가?

이 발표에서는

Page 5: Spring Scala : 스프링이 스칼라를 만났을 때
Page 6: Spring Scala : 스프링이 스칼라를 만났을 때

http://www.flickr.com/photos/familymwr/4393710839/

킬러웹프레임워크는 없다

Page 7: Spring Scala : 스프링이 스칼라를 만났을 때

스프링을 사용할 수 없을까?

Page 8: Spring Scala : 스프링이 스칼라를 만났을 때

Spring=

Page 9: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 스칼라https://github.com/spring-projects/spring-scala

스칼라로 스프링 프레임워크를 쉽게 사용하도록...

v1.0.0 M2

Page 10: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라 클래스를 스프링 빈으로 연결스프링 템플릿을 함수형식으로 사용스칼라의 컬렉션을 의존성 주입JavaConfig를 ScalaConfig

스프링 스칼라

Page 11: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 빈 연동 문제

Page 12: Spring Scala : 스프링이 스칼라를 만났을 때

1 public class Person { 2 private String name; 3 4 public String getName() { 5 return this.name; 6 } 7 8 public void setName(String name) { 9 this.name = name;10 }11 }

Page 13: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라는자바 빈 규약을

따르지 않는다

Page 14: Spring Scala : 스프링이 스칼라를 만났을 때

1 class Person { 2 var name:String = _ 3 }

Page 15: Spring Scala : 스프링이 스칼라를 만났을 때

1 class Person { 2 var name:String = _ 3 4 def name():String = name 5 def name_=(n:String) = name = n 6 }

Page 16: Spring Scala : 스프링이 스칼라를 만났을 때

1 public class Person { 2 private String name; 3 4 public String name() { 5 return this.name; 6 } 7 8 public void name_$eq(String name) { 9 this.name = name;10 }11 }

Page 17: Spring Scala : 스프링이 스칼라를 만났을 때

@BeanProperty해결책 1

Page 18: Spring Scala : 스프링이 스칼라를 만났을 때

1 import scala.beans.BeanProperty 2 3 class Person { 4 5 @BeanProperty 6 var name:String = _ 7 }

Page 19: Spring Scala : 스프링이 스칼라를 만났을 때

Spring Scala해결책 2

Page 20: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 3.2+

BeanInfoFactory 전략 인터페이스 사용

Page 21: Spring Scala : 스프링이 스칼라를 만났을 때

1 <repositories> 2 <repository> 3 <id>repository.springsource.milestone</id> 4 <name>SpringSource Milestone Repository</name> 5 <url>http://repo.springsource.org/milestone</url> 6 </repository> 7 </repositories> 8 9 <dependencies>10 <dependency>11 <groupId>org.springframework.scala</groupId>12 <artifactId>spring-scala</artifactId>13 <version>1.0.0.M2</version>14 </dependency>15 </dependencies>

Page 22: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 템플릿

Page 23: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 스칼라의 템플릿

콜백 인터페이스

null 반환

클래스 파라미터

함수

Option 반환

클래스 매니패스트

Page 24: Spring Scala : 스프링이 스칼라를 만났을 때

SimpleJdbcTemplateJmsTemplateRestTemplateTransactionTemplate

Page 25: Spring Scala : 스프링이 스칼라를 만났을 때

1 template.send("queue", 2 new MessageCreator() { 3 public Message createMessage(Session session) 4 throws JMSException { 5 return session 6 .createTextMessage("Hello World"); 7 } 8 });

Page 26: Spring Scala : 스프링이 스칼라를 만났을 때

1 template.send("queue") { 2 session: Session => 3 session.createTextMessage("Hello World") 4 }

Page 27: Spring Scala : 스프링이 스칼라를 만났을 때

1 RestTemplate restTemplate = new RestTemplate(); 2 3 String result = restTemplate 4 .getForObject( 5 "http://example.com", 6 String.class);

Page 28: Spring Scala : 스프링이 스칼라를 만났을 때

1 val restTemplate = new RestTemplate() 2 3 val result = restTemplate 4 .getForAny[String] 5 ("http://example.com")

Page 29: Spring Scala : 스프링이 스칼라를 만났을 때

ScalaConfig

Page 30: Spring Scala : 스프링이 스칼라를 만났을 때

XML

JavaConfig

Page 31: Spring Scala : 스프링이 스칼라를 만났을 때

XML

JavaConfigScalaConfig

Page 32: Spring Scala : 스프링이 스칼라를 만났을 때

FunctionalConfiguration

Page 33: Spring Scala : 스프링이 스칼라를 만났을 때

1 import org.springframework.scala. 2 context.function.FunctionalConfiguration 3 4 class ScalaExampleConfiguration 5 extends FunctionalConfiguration { 6 7 bean("foo") { 8 "Foo" 9 }10 }

Page 34: Spring Scala : 스프링이 스칼라를 만났을 때

1 class ScalaExampleConfiguration 2 extends FunctionalConfiguration { 3 4 bean( 5 "foo", 6 aliases = Seq("bar") 7 scope = BeanDefinition.SCOPE_PROTOTYPE) { 8 "Foo" 9 }10 }

Page 35: Spring Scala : 스프링이 스칼라를 만났을 때

1 class ScalaExampleConfiguration 2 extends FunctionalConfiguration { 3 4 prototype("foo") { 5 "Foo" 6 } 7 8 singleton("bar") { 9 "Bar"10 }11 }

Page 36: Spring Scala : 스프링이 스칼라를 만났을 때

1 class ScalaExampleConfiguration 2 extends FunctionalConfiguration { 3 4 val conference = bean() { 5 val c = new Conference("SpringCamp") 6 c.when = "2013-10-13" 7 c.where = "코엑스" 8 c 9 }1011 bean("helloService") {12 new HelloService(conference())13 }14 }

Page 37: Spring Scala : 스프링이 스칼라를 만났을 때

FunctionalConfigApplicationContext

Page 38: Spring Scala : 스프링이 스칼라를 만났을 때

1 import org.springframework.scala.context. 2! function.FunctionalConfigApplicationContext 3 4 object HelloApp extends App { 5 val context = 6 FunctionalConfigApplicationContext[ScalaExampleConfiguration] 7 val helloService = context.getBean(classOf[HelloService]) 8 }

Page 39: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 스칼라가있으면스칼라로 스프링을쓸 수 있는가?

http://www.flickr.com/photos/chicagoartdepartment/2919452629/

Page 40: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라로스프링 프로젝트를 연동하려면많은 작업이 필요하다

http://www.flickr.com/photos/joeshlabotnik/4729507364/

Page 41: Spring Scala : 스프링이 스칼라를 만났을 때

스프링 스칼라가 해주는 일은 극히 일부다

http://www.flickr.com/photos/lenore-m/459508939/

Page 43: Spring Scala : 스프링이 스칼라를 만났을 때

Maven

Page 44: Spring Scala : 스프링이 스칼라를 만났을 때

1 <dependencies> 2 <dependency> 3 <groupId>org.scala-lang</groupId> 4 <artifactId>scala-library</artifactId> 5 <version>2.10.1</version> 6 </dependency> 7 </dependencies>

스칼라 라이브러리 추가

Page 45: Spring Scala : 스프링이 스칼라를 만났을 때

scala-maven-plugin

메이븐에서 스칼라 컴파일 및 테스트

v3.1.6 with scala v2.10.1

Page 46: Spring Scala : 스프링이 스칼라를 만났을 때

1 <plugin> 2 <groupId>net.alchim31.maven</groupId> 3 <artifactId>scala-maven-plugin</artifactId> 4 <version>3.1.6</version> 5 <executions> 6 <execution> 7 <id>scala-compile-first</id> 8 <phase>process-resources</phase> 9 <goals>10 <goal>add-source</goal>11 <goal>compile</goal>12 </goals>13 </execution>14 <execution>15 <id>scala-test-compile</id>16 <phase>process-test-resources</phase>17 <goals>18 <goal>testCompile</goal>19 </goals>20 </execution>21 <execution>22 <phase>process-resources</phase>23 <goals>24 <goal>compile</goal>25 </goals>26 </execution>27 </executions>28 </plugin>

Page 47: Spring Scala : 스프링이 스칼라를 만났을 때

프로젝트 구조

srcmainjava

testjava

srcmainjava

testjava

scala

scala

Page 48: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라 클래스

Page 49: Spring Scala : 스프링이 스칼라를 만났을 때

1 class Pet { 2 private var name:String = _ 3 4 def name():String = name 5 def name_=(n:String) = name = n 6 }

Page 50: Spring Scala : 스프링이 스칼라를 만났을 때

1 Pet pet = new Pet(); 2 pet.name_$eq(“Dog”); 3 String n = pet.name();

Page 51: Spring Scala : 스프링이 스칼라를 만났을 때

어노테이션

Page 52: Spring Scala : 스프링이 스칼라를 만났을 때

1 @Controller 2 @SessionAttributes("visit") 3 public class OwnerController { 4 @RequestMapping("/owners/{ownerId}") 5 public ModelAndView showOwner( 6 @PathVariable("ownerId") int ownerId) { 7 // .. 8 } 9 10 @RequestMapping(11 value = "visits/new", 12 method = RequestMethod.GET)13 public String initNewVisitForm() {14 // ..15 }16 }

Page 53: Spring Scala : 스프링이 스칼라를 만났을 때

1 @Controller 2 @SessionAttributes(Array("visit")) 3 class OwnerController { 4 @RequestMapping(Array("/owners/{ownerId}")) 5 def showOwner( 6 @PathVariable("ownerId") ownerId:Int) = { 7 //.. 8 } 910 @RequestMapping(11 value = Array("/visits/new"),12 method = Array(RequestMethod.GET))13 def initNewVisitForm = {14 // ...15 }16 }

Page 54: Spring Scala : 스프링이 스칼라를 만났을 때

1 @Controller 2 public class VisitController { 3 4 private final ClinicService cs; 5 6 @Autowired 7 public VisitController(ClinicService cs) { 8 this.cs = cs; 9 }10 }

Page 55: Spring Scala : 스프링이 스칼라를 만났을 때

1 @Controller 2 class VisitController @Autowired() (cs: ClinicService) { 3 }

Page 56: Spring Scala : 스프링이 스칼라를 만났을 때

어노테이션 의존성 오류

Page 57: Spring Scala : 스프링이 스칼라를 만났을 때

컴파일시어노테이션에 대한의존성이 필요하다

Scala 2.11에서는 해결됨

Page 58: Spring Scala : 스프링이 스칼라를 만났을 때

[WARNING] warning: Class org.joda.convert.FromString not found -

continuing with a stub.

[WARNING] warning: Caught: java.lang.NullPointerException while parsing annotations in joda-time-2.3.jar(org/joda/time/DateTime.class)

[ERROR] error: error while loading DateTime, class file 'joda-time-2.3.jar(org/joda/time/DateTime.class)' is broken

Page 59: Spring Scala : 스프링이 스칼라를 만났을 때

1 org.joda.time.DateTime 2 3 @org.joda.convert.FromString 4 public static DateTime parse(String s) {}

Page 60: Spring Scala : 스프링이 스칼라를 만났을 때

1 <dependency> 2 <groupId>org.joda</groupId> 3 <artifactId>joda-convert</artifactId> 4 <version>1.5</version> 5 </dependency>

Page 61: Spring Scala : 스프링이 스칼라를 만났을 때

joda-time

Page 62: Spring Scala : 스프링이 스칼라를 만났을 때

1 object Joda { 2 implicit 3 def dateTimeOrdering: Ordering[DateTime] = 4 Ordering.fromLessThan(_ isBefore _) 5 }

1 import Joda._ 2 dateTimes.sorted

Page 63: Spring Scala : 스프링이 스칼라를 만났을 때

Collections

Page 64: Spring Scala : 스프링이 스칼라를 만났을 때

스칼라의 컬랙션과 자바의 컬랙션은

다르다

Page 65: Spring Scala : 스프링이 스칼라를 만났을 때

java.util. CollectionList

Map Set

scala.collection.immutable. Iterable List Map Setscala.collection.mutable. Iterable Map Set

Page 66: Spring Scala : 스프링이 스칼라를 만났을 때

1 import scala.collection.JavaConversions._

asJavaCollectionasJavaDictionaryasJavaEnumerationasJavaIterableasJavaIteratorasScalaBuffer...

Page 67: Spring Scala : 스프링이 스칼라를 만났을 때

때로는 자바 클래스를

사용

Page 68: Spring Scala : 스프링이 스칼라를 만났을 때

error: overloaded method value query with alternatives

Page 69: Spring Scala : 스프링이 스칼라를 만났을 때

오버라이드하는 경우

오버로딩된 메서드를 호출하는 경우

타입이 상속구조를 가진 경우

Page 70: Spring Scala : 스프링이 스칼라를 만났을 때

ModelAndView

Page 71: Spring Scala : 스프링이 스칼라를 만났을 때

1 def initFindForm( 2 model: Map[String, Object] 3 ) = {}

error: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [scala.collection.immutable.Map]: Specified class is an interface

Page 72: Spring Scala : 스프링이 스칼라를 만났을 때

Page 74: Spring Scala : 스프링이 스칼라를 만났을 때

- 스칼라로 스프링을 사용할 수 있다

- 스프링는 검증된 프레임워크이므로 통합하고 나면 쓸만해 보인다

- 이슈는 있지만 타입오류나 자바와 스칼라의 모양이 다른 작은 이슈들이다

- 레퍼런스는 거의 없으므로 이슈는 직접 해결해야 한다

Page 75: Spring Scala : 스프링이 스칼라를 만났을 때

Questions?

http://www.flickr.com/photos/olivander/68140297/