Programming/Backend2016.10.18 23:14

프로젝트도 생성했으니 이제 뭔가 해보자. 


음.. 아무래도 Backend 이고 하니... DB가 있어야 겠다. 많이 쓰는 Mysql 로 해보자.


MySQL 을 사용하려면 MySQL용 Database connector 를 추가해야 한다. 


package.swift 의 dependency로 추가 가능하다.

import PackageDescription
 
let package = Package(
    name: "FirstPerfectProject",
    dependencies: [
        .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2, minor: 0),
        .Package(url:"https://github.com/PerfectlySoft/Perfect-MySQL.git", majorVersion: 2, minor: 0)
    ]
)


Xcode에서 build를 해보자. (xcode에서 실행하는 방법은 이전 글에서 생략했다.... 실수로..)




왜.. 오류지?!


음.. 그럼.. 처음에 했던 swift build를 해보자.

$ swift build
Cloning https://github.com/PerfectlySoft/Perfect-MySQL.git
HEAD is now at 53ef1af Fixes ISS-269 - numRows always returns 0
Resolved version: 2.0.1
Cloning https://github.com/PerfectlySoft/Perfect-mysqlclient.git
HEAD is now at 60a82d5 A little cleanup
Resolved version: 2.0.0
Compile Swift Module 'MySQL' (1 sources)
Compile Swift Module 'PerfectLib' (10 sources)
Compile Swift Module 'PerfectHTTP' (9 sources)
Compile CHTTPParser http_parser.c
Linking CHTTPParser
Compile Swift Module 'PerfectHTTPServer' (5 sources)
Compile Swift Module 'FirstPerfectProject' (1 sources)
Linking ./.build/debug/FirstPerfectProject

오!! 빌드했더니 Perfect-MySQL 을 다운로드 받는다~!


이제 run 할 수 있겠다.  Xcode에서 실행해보자.





또 같은 오류!!!!!!


무엇이 문제일까?  Xcode에서 실행하지 말고 터미널에서 실행해볼까?

$ swift build Compile Swift Module 'MySQL' (1 sources) Compile Swift Module 'PerfectLib' (10 sources) Compile Swift Module 'PerfectHTTP' (9 sources) Compile Swift Module 'PerfectHTTPServer' (5 sources) Compile Swift Module 'FirstPerfectProject' (1 sources) Linking ./.build/debug/FirstPerfectProject

오! MySQL이 빌드 되었다. (역시 내 잘못이 아니야... Xcode.. 망할)


MySQL 이 잘 되는지 확인하기 위해 기존 코드에서 MySQL 을 import 해보자.

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
import MySQL
 
// Create HTTP server.
let server = HTTPServer()
 
// Register your own routes and handlers
var routes = Routes()
routes.add(method: .get, uri: "/", handler: {
        request, response in
        response.setHeader(.contentType, value: "text/html")
        response.appendBody(string: "<html><title>Hello, world!<title><body>Hello, world!</body></html>")
        response.completed()
    }
)
 
// Add the routes to the server.
server.addRoutes(routes)
 
// Set a listen port of 8181
server.serverPort = 8181
 
do {
    // Launch the HTTP server.
    try server.start()
} catch PerfectError.networkError(let err, let msg) {
    print("Network error thrown: \(err) \(msg)")
}

직접 사용하지는 않지만 import 했으니 오류 없이 잘 실행 되어야 겠지? MySQL이 제대로 연결 안 되었다면 오류가 뜰거야. (아마도..)


빌드 후 실행해 보자.

build/debug/FirstPerfectProject
[INFO] Starting HTTP server on 0.0.0.0:8181 with document root ./webroot

오오오오... 성공!


이렇게 package.swift 에 dependency 를 추가하고 빌드만 하면 잘 된다.


그럼 xcode 에서는 왜 안 될까?


Xcode 프로젝트는 구성이 좀 까다롭다. project 파일을 지우지 말고 다시 생성해 보자.

$ swift package generate-xcodeproj
generated: ./FirstPerfectProject.xcodeproj

프로젝트 재생성도 했으니 실행을 해보자~



많은 삽질 끝에 방법을 찾았다.



문서를 읽으면 한번 봤을 내용입니다. Xcode 프로젝트를 생성하고 target이 아닌 project 의 build setting 에 추가로 설정을 해줘야 한다.

Library Search Paths 에 $(PROJECT_DIR) recursive 로 설정한다.



이제 빌드하면 성공적으로 완료한다. 


문제는 이게 dependency 를 추가하고 xcode project를 생성할 때마다 설정해줘야 한다는 것이다.

왜 저 설정을 default로 넣지 않는지 모르겠다..


잊지 말자 $(PROJECT_DIR)



dependency 설정 끝~




Getting Started From Scratch https://www.perfect.org/docs/gettingStartedFromScratch.html


Building with Swift Package Manager https://www.perfect.org/docs/buildingWithSPM.html

신고
Posted by 초프(초보 프로그래머)
Programming/Backend2016.10.15 21:12

Swift 서버 프레임워크가 몇가지 있는데 그중에 가장 먼저 접하게 된 것이 Perfect(https://www.perfect.org) 이다. 처음에는 문서도 부족해서 자세히 알아 볼 기회가 없었다. 오늘 새로운 서버 기능을 추가하기 위해 어떤 프레임워크를 써볼까 하다 갑자기 Perfect가 떠올라 문서를 읽어 보기로 했다.


새로 프로젝트를 시작하는 것은 어려운 일이 아니다. 알고 보니 정말 간단하다. 그 간단한것을 다시 한번  정리해 본다.


Swift3 에 맞춰 Perfect 2가 출시되었다. 이 내용도 Swift3, Perfect2 에 맞춰 작성한다.


새로운 프로젝트를 생성하는 방법에는 크게 2가지가 있다.

두가지 방법도 해보았지만 그래도 역시 처음은 새로 작성하는 것이 좋다고 생각한다. 그래서 그 방법에 따라 작성한다.

프로젝트 폴더를 생성한다. 

$ mkdir FirstPerfectProject
$ cd FirstPerfectProject


Package.swift 파일을 생성한다.

$ vi Package.swift

다음 코드를 붙여 넣는다.

import PackageDescription
 
let package = Package(
    name: "FirstPerfectProject",
    dependencies: [
        .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2, minor: 0)
    ]
)

name 은 프로젝트 이름이며 빌드 후 생성되는 실행파일 명이다.


dependencies 는 다른 라이브러리를 추가하는 부분이다. 아직 예제에 나온 라이브러리들만 추가해 봤음. gradle, cocoapods 를 사용해봤다면 낯설지 않은 부분이다.


이제 소스 파일을 작성할 폴더를 만들고 간단한 코드를 작성해 보자.

$ mkdir Sources
$ echo 'print("Well hi there!")' >> Sources/main.swift

이제 실행 가능한 조건은 모두 충족되었다. 이제 실행을 해보자.

$ swift build
$ .build/debug/MyAwesomeProject

swift build 를 통해서 프로젝트를 빌드한다. 빌드를 하게 되면 .build 폴더가 생기며 실행 파일은 package 의 name으로 생성된다.

빌드를 하면 dependecies 에 설정된 git에서 소스 파일들을 다운로드 받아서 빌드를 하게 된다. 빌드가성공하면 실행해 보자.

$ .build/debug/FirstPerfectProject
Well hi there!

실행이 되었다. 그런데 이건 REST 가 아니네? 물론 테스트를 위한 코드입니다.

이제 REST 를 테스트해보자.  main.swift를 다시 수정하자.

$ vi Sources/main.swift

기존 코드는 지우고 다음 코드를 붙여넣는다. 

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
 
// Create HTTP server.
let server = HTTPServer()
 
// Register your own routes and handlers
var routes = Routes()
routes.add(method: .get, uri: "/", handler: {
        request, response in
        response.setHeader(.contentType, value: "text/html")
        response.appendBody(string: "Hello, world!Hello, world!</body></html>")
        response.completed()
    }
)
 
// Add the routes to the server.
server.addRoutes(routes)
 
// Set a listen port of 8181
server.serverPort = 8181
 
do {
    // Launch the HTTP server.
    try server.start()
} catch PerfectError.networkError(let err, let msg) {
    print("Network error thrown: \(err) \(msg)")
}

1초만에 코드를 다 작성했으니 이제 빌드를 해보자.

$ swift build
$ .build/debug/FirstPerfectProject
[INFO] Starting HTTP server on 0.0.0.0:8181 with document root ./webroot

오..! 서버가 실행됐다! localhost:8181 로 접속해 보자.



오.... 코드에 나와 있는 대로 uri 가 / 일때  Hello, world! 가 출력됐다.



이제 문서를 더 읽고 제대로 만들어 보자!!


https://www.perfect.org/docs/handlingRequests.html


https://github.com/PerfectlySoft/Perfect


문서 내용을 다 읽는데 많은 시간이 걸리지 않는다. 2~3시간이면 모든 내용을 읽을 수 있다.


아직 초기 단계라 아쉬운 부분이 많이 있다. ORM, auth 라든지 여러 부분이 아직 지원되지 않는다.


하지만 없다고 사용 못할 수준은 아니다. 마이크로 프레임워크라고 생각하고 사용하자.


실제 프로젝트에 적용할 수 있을지 없을지... 제가 한번 해보겠습니다.


후후....



오늘 내용이 많이 도움이 되었나요? 

더 자세한 내용은...


당신의 몫



신고
Posted by 초프(초보 프로그래머)
Programming/iOS2014.05.08 00:09

podspec을 이용하여 라이브러리를 만들때가 있습니다.

dependency를 추가할때 cocoapods에 있는 library면 쉽게 추가가 가능하다. 

하지만 *.framework 파일을 추가하려고 하니 cocoapods 사이트에서도 정보를 찾기 어렵습니다.


해결방법은 vendored_frameworks를 이용하는 것입니다.

spec.vendored_frameworks = 'Framework/KakaoOpenSDK.framework'


pod install 후 확인해 보면 잘 설정되어 있음을 확인할 수 있습니다.


신고
Posted by 초프(초보 프로그래머)
Programming/JAVA2012.10.05 21:31

새로운 회사에 들어 와 새로운 프레임워크를 사용하게 되었습니다.

이미 많이 사용하고 있는 Spring Framework 3 입니다.

한달이 다 되어 가지만 기본 구조도 제대로 모른체 끼어 맞추기 식으로 계속 코딩을 해 왔습니다.

일정을 길게 잡고 해도 눈치가 보이고 스스로 기분이 안 좋아 졌습니다.

내가 이 정도 밖에 안 되나? 라는 생각을 많이 하게 됩니다.

그래서 회사에 있던 '스프링 인 액션' 책을 펼쳤습니다.

책을 읽으면서 정리할 것을 간단히... 아주 간단히 정리해 보려고 합니다.

혼자 맘 내키면 하는거라 언제 정리를 안 하게 될지는 모르겟으나.. 일단 시작합니다.


1. Bean or Java Bean

두개는 같은 말이며 자바에서 컴포넌트를 가르키는 말이다.


2. POJO (Plain-Old Java Object)

기타 다른 것 등을 사용하지 않은 평범한 자바 객체


3. DI (Dependency Injection) - 종속객체 주입

A Class 에서 B Class의 객체를 생성하여 사용하고 있다고 가정하자. 결합도가 높아지며 단위 테스트에도 어려움이 생긴다.

B Class의 객체 생성을 A Class 내부에서 하지 않고 application context 등에서 해준다.

A Class에서 B Class의 객체를 필요로 할때 자동으로 생성해 준다.

결합도를 낮추고 단위 테스트가 쉽게 해준다.


4. 와이어링 (wiring)

애플리케이션 컴포넌트 간의 관계


5. 애플리케이션 컨텍스트 (application context)

빈에 관한 정의를 바탕으로 객체 생성과 와이어링을 책임진다


6. AOP (Aspect Oriented Programming) - 관점지향 프로그래밍

로직과는 상관없는 로깅 같은 코드가 많은 부분에 들어 가 있을 것 이다.

코드를 일차원적인 흐름에서 보는게 아니라 옆면에서 보는 것과 비슷하다

여러 위치에서 수행되는 동일한 코드를 외부에서 정의하여 수행할 수 있도록 해준다.


7. pointcut

AOP 에서 사용하는 용어이다.

junit 에서 when과 비슷하다고 판단된다.

특정 코드를 실행할 위치라고 보면 될것 같다.


8. spring container

spring framework에서 사용되며 객체의 라이프 사이클을 관리한다.

객체 생성에서 부터 소멸까지의 과정을 관리 한다.

DI를 이용해서 컴포넌트를 관리한다.


9. 빈팩토리 (org.springframework.beans.factory.BeanFactory)

spring container 중 하나.

DI에 대한 기본적인 지원을 제공하는 가장 단순한 container.


10. 애플리케이션 컨텍스트 (org.springframework.context.ApplicationContext)

프로퍼티 파일에서 메시지를 읽어서 이벤트 발행 같은 프레임워크 서비스를 제공하는 container.


11. ClassPathXmlApplicationContext / FileSystemXmlApplicationContext / XmlWebApplicationContext

ApplicationContext 파일을 읽어 오는 방법이 다른 3가지 클래스


12. ORM (Object-Relational Mapping) - 객체 관계 매핑

객체와 테이블을 매핑하여 사용할 수 있게 해주는 도구


오늘은 여기 까지...; 



신고
Posted by 초프(초보 프로그래머)
Programming2012.09.26 00:37

따로 정리하는게 의미가 없다고 생각되어 그냥 링크만 남겨요~


http://scala-ide.org/docs/tutorials/play20scalaide20/index.html

신고
Posted by 초프(초보 프로그래머)
Programming/iOS2011.06.02 01:19
CFNetwork.framework 를 찾아서 추가해야 하는데... 검색이 안되네요.

구글에서 검색해 보니

CoreServices.framework 안에 있다고 합니다.  

그러므로 CoreServices.framework를 추가하면 됩니다.
신고
Posted by 초프(초보 프로그래머)