Ajax 기술문서 - 김연수Yeon Soo KimAjax 기술 문서(작성자 : 김연수)
(첫 회사에 입사하여 만든 사내 배포용 기술 문서)
Ajax In Action 도서를 참고하며 자료를 만들었으며, 이 자료를 만들면서 AJAX에 대한 많은 이해를 하게 됐던 거 같다.
작성일자는 잘못된 것이고, 2007년에 만들고 발표한 것으로 추정된다.
Objective-C Runtime Programming GuideSung-Kwan KimObjective-C Runtime Programming Guide 요약 자료입니다.
Objective-C 런타임을 사용하면 성능을 향상 시킬수 있는 기법을 사용할 수 있습니다.
동적 바인딩이 속도면에서는 접고 들어가는거라 런타임 기능을 이해하면 좀 더 향상된 앱을 개발할 수 있지 않을까 합니다~~
일부 다른 자료 참고했고, 이미지도 이모씨!!의 자료 사용했습니다~ㅋ
Ajax 기술문서 - 김연수Yeon Soo KimAjax 기술 문서(작성자 : 김연수)
(첫 회사에 입사하여 만든 사내 배포용 기술 문서)
Ajax In Action 도서를 참고하며 자료를 만들었으며, 이 자료를 만들면서 AJAX에 대한 많은 이해를 하게 됐던 거 같다.
작성일자는 잘못된 것이고, 2007년에 만들고 발표한 것으로 추정된다.
Objective-C Runtime Programming GuideSung-Kwan KimObjective-C Runtime Programming Guide 요약 자료입니다.
Objective-C 런타임을 사용하면 성능을 향상 시킬수 있는 기법을 사용할 수 있습니다.
동적 바인딩이 속도면에서는 접고 들어가는거라 런타임 기능을 이해하면 좀 더 향상된 앱을 개발할 수 있지 않을까 합니다~~
일부 다른 자료 참고했고, 이미지도 이모씨!!의 자료 사용했습니다~ㅋ
안드로이드 데이터 바인딩GDG KoreaThe document discusses Android Data Binding, which allows binding UI components in XML layouts to data sources in code. It introduces basic data binding, using Observables to track changes, binding collections, and using data binding with RecyclerView. Expressions can be used to bind data and call methods. Data binding avoids findViewById and directly updating views, supports code reuse, and automatically updates UIs when data changes.
D2 OPEN SEMINAR - WWDC 핫 이슈NAVER D2The document discusses several new features and enhancements in UIKit in iOS 10, including a new UIPreviewInteraction class, advances in UIKit animations with new classes and protocols, a new UIPasteboard API, and enhancements to UICollectionView like interactive reordering support and UIRefreshControl directly supported in UICollectionView. It also covers best practices for working with cells in UICollectionView and UITableView, including how to handle expensive data models using the new pre-fetching APIs.
D2 OPEN SEMINAR - WWDC 핫 이슈NAVER D2This document summarizes sessions from WWDC 2016 related to media and graphics. It discusses advances in iOS photography including new camera capture outputs, Live Photos, RAW format support, and wide color capture. Sessions covered Live Photo editing, RAW processing, using AVCapturePhotoOutput, capturing preview images, wide color capture on iPad Pro, and scene monitoring. Privacy changes in iOS 10 were also mentioned.
D2 OPEN SEMINAR - WWDC 핫 이슈NAVER D2Xcode 8 includes new features such as active line highlight in code, Swift image and color literals, improved documentation generation, and app extensions. The API reference is now unified across platforms. Interface Builder has a new configuration bar and support for varying traits for different sizes. Static analysis is improved with new analyzers. Runtime issues are easier to detect and the memory debugger provides a graph of objects.
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom RheeJavascript의 함수가 실행될때 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context)에 설정되는 것들과 주의할 점들
웹서버 부하테스트 실전 노하우IMQA Bestcon 2019에 발표한 웹서버 성능 테스트 실전 노하우 자료입니다.
테스트 케이스 생성부터, 테스트 전략, 데이터 해석 (APM, 인프라 모니터링), 클라우드에서 주의할 사항등 도움이 될만한 내용들만 간추려 전달합니다.
부하 테스트시 어니컴을 불러주세요
실전 서버 부하테스트 노하우 YoungSu SonBestcon 2019에 발표한 웹서버 성능 테스트 실전 노하우 자료입니다.
테스트 케이스 생성부터, 테스트 전략, 데이터 해석 (APM, 인프라 모니터링), 클라우드에서 주의할 사항등 도움이 될만한 내용들만 간추려 전달합니다.
부하 테스트시 어니컴을 불러주세요
Golang Project Guide from A to Z: From Feature Development to Enterprise Appl...Kyuhyun ByunThis comprehensive presentation offers a deep dive into Go language development methodologies, covering projects of all scales. Whether you're working on a small prototype or a large-scale enterprise application, this guide provides valuable insights and best practices.
Key topics covered:
Distinguishing between small and large projects in Go
Code patterns for small, feature-focused projects
Comparison of Handler and HandlerFunc approaches
Enterprise application design using Domain Driven Design (DDD)
Detailed explanations of architectural layers: Presenter, Handler, Usecase, Service, Repository, and Recorder
NoSQL (DynamoDB) modeling techniques
Writing effective test code and using mocking tools like 'counterfeiter'
Essential tools for production-ready applications: APM, error monitoring, metric collection, and logging services
This presentation is ideal for Go developers of all levels, from beginners looking to structure their first projects to experienced developers aiming to optimize large-scale applications. It provides practical advice on code organization, testing strategies, and operational considerations to help you build robust, maintainable Go applications.
Whether you're starting a new project or looking to improve an existing one, this guide offers valuable insights into Go development best practices across different project scales and complexities.
4. 3
01 Transaction
Realm 객체를 사용하기 전 Transaction에 대해서 알아보자.
1 Transaction이란?
1 데이터 베이스에서 읽거나 쓰기 위해 실행하는 여러 개의
쿼리(질의)를 끊기지 않고 전부 수행하기 위한 것.
-> 완전성(integrity)를 보장
2 Atomicity(원자성), Consistency(일관성),
Isolation(고립성), Durability(영구성)을 보장한다.
Realm은 MVCC 아키텍처를 사용하기 때문에 쓰기 트랜잭션 실행되도
읽기는 막히지 않는다.
-> 읽기는 언제든지 객체를 접근 할 수 있다.
-> 추가, 수정, 삭제는 트랜잭션 안에서 해야한다.
5. 4
MVCC
다중 버전 동시성 제어(multiversion concurrency control)
A가 읽기에 대한 처리를 트랜잭션을 통해 수행하면 동일 데이터를
다른 사람 B는 A가 끝날 때까지 접근을 할 수 없었다.
하지만 MVCC는 A가 트랜잭션을 할 때 동일한 데이터를 복사해 두어
B도 동시에 접근을 가능하게 만들었다.
쉽게 말해서 [동시에 여러명이 접근이 가능하게 했다] 라는 것이다.
6. 5
01 Transaction
Realm에서 Transaction을 관리하는 법을 알아보자.
Transaction
관리하기
1 수동으로 관리하기
// Realm 인스턴스를 얻습니다
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
// 객체를 여기에서 추가하거나 갱신합니다
realm.commitTransaction();
// commit이 호출되면 모든 작업이 정상적으로 완료한 것입니다.
realm.cancelTransaction();
// 오류가 났을 때는 cancel을 호출하여 모든 작업을 취소할 수 있습니다.
7. 6
01 Transaction
Realm에서 Transaction을 관리하는 법을 알아보자.
Transaction
관리하기
2 자동으로 관리하기
// Realm 인스턴스를 얻습니다
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class);
user.setName("John");
user.setEmail("john@corporation.com");
}
});
Transaction 블록을 사용하여 간편하게 Transaction을 관리할 수 있다.
8. 7
01 Transaction
Realm에서 Transaction을 관리하는 법을 알아보자.
Transaction
관리하기
3 비동기 트랜잭션(Async)
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm bgRealm) {
// 수행할 내용.
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
// 트랜잭션이 성공하면 호출되는 콜백 함수.
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
// 트랜잭션이 실패하면 호출되는 콜백 함수
}
});
9. 8
동기 & 비동기
동기 (Synchronous: 동시에 일어나는)
- 요청과 그 결과가 동시에 일어난다는 약속
- 장점 : 설계가 간단하고 직관적이다.
- 단점 : 결과가 주어질 때까지 아무것도 못하고 대기해야 한다.
비동기 (Asynchronous: 동시에 일어나지 않는)
- 요청과 그 결과가 동시에 일어나지 않을 것이라는 약속이다.
-> 요청한 그 자리에서 바로 결과가 주어지는 것이 아니라,
이따가 준다고 약속하는 것이다.
- 장점 : 결과가 주어지지 않아도 그 시간 동안 다른 작업을 할 수 있다.
- 단점 : 설계가 복잡하다.
10. 9
01 Transaction
Realm에서 Transaction을 관리하는 법을 알아보자.
Transaction
관리하기
3 비동기 트랜잭션(Async)
API
Public RealmAsyncTask executeTransactionAsync(Realm.Transaction transaction);
Public RealmAsyncTask executeTransactionAsync(Realm.Transaction transaction,
Realm.Transaction.OnSuccess onSuccsess);
Public RealmAsyncTask executeTransactionAsync(Realm.Transaction transaction,
Realm.Transaction.OnError onError);
Public RealmAsyncTask executeTransactionAsync(Realm.Transaction transaction,
Realm.Transaction.OnSuccess onSuccsess,
Realm.Transaction.OnError onError);
백그라운드 쓰레드에서 쓰기 작업을 하는 중인데 UI 쓰레드가 쓰기 작업을
하려고 하면 ANR에러가 발생할 수 있다.
-> 때문에 비동기 트랜잭션을 사용한다.
OnSuccess와 OnError 콜백은 선택 사항으로 사용하면 된다.
콜백은 Looper에 의해 제어되고 Looper 스레드에서만 허용된다.
11. 10
01 Transaction
Realm에서 Transaction을 관리하는 법을 알아보자.
Transaction
관리하기
3 비동기 트랜잭션(Async)
비동기 트랜잭션은 RealmAsyncTask 객체로서 저장할 수 있다.
RealmAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() {
// 수행할 내용.
});
객체로 표현하는 이유는 트랜잭션이 끝나기 전에 액티비티나 프레그먼트를 끝내야
할 때 대기중인 트랜잭션을 취소하기 위해서도 사용하기 때문이다.
Ex) 1. 현재 대기중인 트랜잭션이 있다고 가정하자.
2. 이 트랜잭션을 수행한 다음에는 액티비티의 TextView를 갱신한다.
3. 하지만 이 트랜잭션이 수행되기 전에 액티비티를 종료하였다.
4. 만약 트랜잭션이 그대로 수행된다면 존재하지 않는 메모리에 TextView에 대한
데이터 갱신 작업을 수행해야 하는 것이다.
앱이 충돌할 수 있다.
때문에 액티비티를 종료하기 전에 확인 작업을 해주어야 한다.
public void onStop () {
if (transaction != null && !transaction.isCancelled()) {
transaction.cancel();
}
}
13. 12
02 쓰기
Realm 객체를 생성하는 법을 알아보자.
객체 생성하기
1 Realm을 통해 객체 생성하기
RealmObject들은 Realm과 긴밀하게 연결되어 있기 때문에
Realm을 통해 인스턴스가 생성되어야 한다.
realm.beginTransaction();
User user = realm.createObject(User.class); // 새 객체 만들기
user.setName("John");
user.setEmail("john@corporation.com");
realm.commitTransaction();
Realm에 의해 관리되는 객체의 데이터를 수정할 경우 Transaction 안에서 해줘야
한다는 단점이 있을 수 있다.(내 생각)
14. 13
02 쓰기
Realm 객체를 생성하는 법을 알아보자.
객체 생성하기
2 객체를 생성 후 Realm에 등록하기
Realm을 통해서만 객체를 생성할 때는 불편한 점이 있을 수 있다.
그때는 Realm.copyToRealm() 메소드를 사용하여 등록하면 된다.
User user = new User("John");
user.setEmail("john@corporation.com");
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);
realm.commitTransaction();
< 중요 > copyToRealm을 사용할 때 반환되는 객체를 Realm이 관리한다.
-> 원본 객체(user)의 내용을 바꿔도 Realm에 있는 데이터가 바뀌는 것이 아니다.
-> Realm이 관리하는 객체(realmUser)를 바꿔야 Realm에 있는 데이터가 바뀐다.
15. 14
02 쓰기
객체를 생성하고 쓰기를 할 때 주의할 점을 알아보자.
주의 할 점
createObject를 사용하여 객체를 처음 생성할 경우 Realm은 RealmObject안에 있
는 필드의 내용을 default value(쓰레기값)으로 설정을 하고 객체를 만든다.
이때 객체의 필드에 PrimaryKey가 등록되어 있으면 충돌이 일어 날 수 있다.
-> default value는 고정값이기 때문이다.
이를 해결하기 위해서는 비관리 객체를 생성하고 PrimaryKey에 대한 값을 설정한
다음 copyToRealm을 이용해서 Realm에 등록해 주어야 한다.
User user = realm.createObject(User.class); // 필드들에 대한 값을 default value로 설정한다.
// 이때 PrimaryKey에 대한 충돌이 날 수 있다.
User user = new User("John");
uesr.setId(value);
realm.beginTransaction();
User realmUser = realm.copyToRealm(user);
realm.commitTransaction();
// 이렇게 해주면 충돌을 피할 수 있다.
1 PrimaryKey 충돌
16. 15
02 쓰기
객체를 생성하고 쓰기를 할 때 주의할 점을 알아보자.
주의 할 점
Realm은 문자열이나 바이트 배열의 개별 요소를 갱신하는 것은 불가능하다.
특정 요소를 갱신하기 위해선 아래처럼 해야한다.
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
bytes[] bytes = realmObject.binary;
bytes[4] = 'a';
realmObject.binary = bytes;
}
});
2 문자열과 바이트 배열 갱신하기
Realm이 MVCC 아키텍처에 따라 기존의 데이터를 변경하는 것을 막아 다른 스레드와
프로세스가 안정된 상태의 데이터를 읽기 위함이다.
18. 17
03 질의(Query)
Realm의 기본적인 사용법(1)
질의의 시작은 realm.where를 시작으로 하며 끝은 find(All)을 통해 끝난다.
Realm의 모든 질의는 바로 처리되지 않고 속성에 접근할 때에만 데이터를 읽는다.
API
(Realm.class) Public RealmQuery<E> where(java.lang.Class<E> class);
(RealmQuery.class) Public RealmResults<E> findAll();
(RealmQuery.class) Public RealmResults<E> findAllAsync();
(RealmQuery.class) Public RealmResults<E> findAllSorted(String fieldName);
(RealmQuery.class) Public E findFirst();
19. 18
03 질의(Query)
Realm의 기본적인 사용법(1)
// Build the query looking at all users:
RealmQuery<User> query = realm.where(User.class);
// 질의 조건을 추가합니다
query.equalTo("name", "John");
query.or().equalTo("name", "Peter");
// 질의를 수행합니다
RealmResults<User> result1 = query.findAll();
질의를 통해 나온 결과가 RealmResults에 저장되어 나온다.
이때 객체는 복사되지 않고, 레퍼런스가 저장되어 있는 RealmResult를 통해서
직접적으로 다룰 수 있다.
RealmResults는 AbstractList를 상속받았기 때문에
각 객체는 인덱스를 통해서 접근이 가능하다.
또한 질의에 맞는 결과가 없더라도 null을 반환하지 않고
size()메소드가 0을 반환한다.
각 객체의 내용을 수정하거나 삭제할 경우 Transaction을 이용해야 한다.
21. 20
03 질의(Query)
Realm의 Query engine에 대해서 알아보자.
Fluent interface
Realm은 Query Engine으로 Fluent interface를 사용하였다.
Fluent interface란 메소드 체이닝(method chaining) 기법으로
return 값으로 자기 자신 또는 다른 객체를 지정 함으로서
메소드를 연속적으로 호출 할 수 있도록 하는 기법이다.
가장 쉽게 볼 수 있는 것은 자바스크립트(또는 Jquery)에서 볼 수 있다.
document.getElementById("demo").innerHTML…
안드로이드에서 쉽게 볼 수 있는 곳은 Toast 부분에서이다.
Toast.makeText(…).show(); (또는 스낵바)
Toast의 makeText는 return 값으로 Toast 객체를 반환한다.
-> 즉 자기 자신을 반환하는 것이다. 때문에 자기 자신의 메소드를
다시 호출 할 수 있어서 메소드 체이닝이 가능하게 된다.
Realm의 Query도 이러한 구조를 띄고 있다.
22. 21
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
1 조건 관련 질의
대부분 이름만으로 설명이 된다.
• between(), greaterThan(), lessThan(), greaterThanOrEqualTo(), lessThanOrEqualTo()
-> (필드 이름, 숫자 (, 숫자))
• equalTo(), notEqualTo()
-> (필드 이름, 값)
• contains(), beginsWith(), endsWith()
-> (필드 이름, 문자)
• isNull(), isNotNull()
-> (필드 이름)
• isEmpty(), isNotEmpty()
-> (필드 이름)
equalTo(), contains(), beginsWith(), endsWith()
문자에 대한 질의 중 이 4개에 대해서는
(필드 이름, 문자, case)를 통해서 대소문자를 구분의 유무를 정할 수 있다.
-> CASE.SENSITIVE , CASE.INSENSITIVE
23. 22
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
2 논리 연산자
• Realm의 Query는 암묵적으로 and 연산을 가지고 있으며 or연산이
필요할 때는 or연산만 명시해주면 된다.
• 그룹 조건의 연산 순서를 명시하기 위해서는 왼쪽 괄호로 beginGroup()을
사용하고 오른쪽 괄호로 endGroup()을 사용한다.
• not()으로 부정 조건을 만들 수 있다. 하위 조건을 부정하기 위해서는
beginGroup과 endGroup을 함께 사용해야 한다.
RealmResults<User> r = realm.where(User.class)
.greaterThan("age", 10) // 암묵적인 AND
.beginGroup()
.equalTo("name", "Peter")
.or()
.contains("name", "Jo")
.endGroup()
.findAll();
24. 23
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
3 결과 정렬하기
RealmResults<User> result = realm.where(User.class).findAll();
result = result.sort("age"); // 오름차순으로 정렬
result = result.sort("age", Sort.DESCENDING); // 내림차순으로 정렬
API (RealmResults.class)
Public RealmResults<E> sort(String fieldname);
Public RealmResults<E> sort(String fieldname, Sort sortOrder);
Public RealmResults<E> sort(String[] fieldname, Sort[] sortOrder);
Public RealmResults<E> sort(String fieldname1, Sort sortOrder1,
String fieldname2, Sort sortOrder2);
Sort.Enum - Sort.ASCENDING, Sort.DESCENDING
25. 24
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
4 집합(arregation)
RealmResults<User> results = realm.where(User.class).findAll();
long sum = results.sum("age").longValue();
long min = results.min("age").longValue();
long max = results.max("age").longValue();
double average = results.average("age");
long matches = results.size();
API (RealmResults.class)
숫자가 저장되어 있는 필드만 지원한다.
Public Number sum(String fieldname);
Public Number max(String fieldname);
Public Number min(String fieldname);
Public double average(String fieldname);
26. 25
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
5 삭제(Deletion)
final RealmResults<Dog> results = realm.where(Dog.class).findAll();
// 데이터에 대한 모든 변경은 트랜잭션에서 이루어져야 합니다
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// 하나 맞는 데이터를 삭제합니다
results.deleteFirstFromRealm();
results.deleteLastFromRealm();
// 하나의 객체를 삭제합니다
Dog dog = results.get(5);
dog.deleteFromRealm();
// 전체 맞는 데이터를 삭제합니다
results.deleteAllFromRealm();
}
});
27. 26
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
// RealmResults에서 맨 처음 객체를 삭제하거나 맨 마지막 객체를 삭제합니다.
results.deleteFirstFromRealm();
results.deleteLastFromRealm();
// 하나의 객체를 삭제합니다
Dog dog = results.get(5);
dog.deleteFromRealm();
1) 하나의 데이터를 삭제하는 방법
이렇게 할 경우 Realm에서는 실제로는 삭제가 되었지만,
RealmResults에서는 삭제가 되지 않았을 수도 있다.
-> 후에 RealmResults에서 삭제한 데이터가 다시 검색될 수도 있다.
// RealmResults에서 삭제를 직접한다.(realm 문서 – 질의 – 반복자 참고)
results.deleteFromRealm(5);
5 삭제(Deletion)
28. 27
03 질의(Query)
Realm의 Query의 몇 가지 종류를 알아보자.
Query
API (RealmResults.class)
Public Boolean deleteAllFromRealm();
Public Boolean deleteFristFromRealm();
Public Boolean deleteLastFromRealm();
Public void deleteFromRealm(int location);
API (RealmObject.class)
Public void deleteFromRealm();
5 삭제(Deletion)
2) 결과에 맞는 여러 개의 데이터를 삭제하는 방법
// RealmResults에 있는 모든 데이터를 삭제한다.
results.deleteAllFromRealm();
29. 28
03 질의(Query)
Realm의 비동기 질의에 대해서 알아보자.
비동기 질의
Realm의 대부분의 질의는 UI스레드에서 동기적으로 처리할 수 있을 정도로
충분히 빠르다.
하지만 복잡한 질의나 대규모 데이터 집합을 질의하는 경우, 백그라운드에서
질의 하는 것이 더 나은 경우들이 있다.
RealmResults<User> result = realm.where(User.class)
.equalTo("name", "John")
.or()
.equalTo("name", "Peter")
.findAllAsync();
// findAll 이였던 부분을 findAllAsync로만 바꿔주면 된다.
질의는 블록되지 않고 즉시 RealmResults를 반환하는 것을 유의해야 한다.
-> 표준 자바의 Future와 흡사한 구조이다. (Thread와 관련 있는 것으로 생각된다)
질의는 백그라운드에서 계속되며 한번 완료되면 반환된
RealmResults 인스턴스를 갱신한다.
30. 29
03 질의(Query)
Realm의 비동기 질의에 대해서 알아보자.
비동기 질의
1) 백그라운드에서 질의가 끝났는지 확인할 수 있다.
if (result.isLoaded()) {
// 결과는 지금 사용할 수 있습니다
}
2) 비동기 질의를 강제적으로 동기적으로 로딩 할 수 있다.
동기적으로 획득한 RealmResults의 isLoaded()를 호출하면 항상 true를 반환한다.
result.load() // 주의하세요. 이 코드는 현재 스레드를 반환될 때까지 멈추게 합니다
3) 루퍼 스레드에서만 비동기 질의를 사용할 수 있다.
비동기 질의는 결과를 일관되게 전달하기 위해 Handler를 사용한다.
Looper 없이 스레드 내에서 비동기 질의를 하게 되면
ILLegalStateException을 발생시킨다.