Cookbook - samerook/samerook_test GitHub Wiki

Android ORM์˜ ์„ค๋ช…๊ณผ ํ˜„์žฌ๋ฒ„์ „, ๊ตฌํ˜„ ๊ธฐ๋Šฅ ๋ชฉ๋ก ๋“ฑ์„ ์œ„ํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ์‹ญ์‹œ์˜ค.

**[Get Started](Get Started)**

1. Android ORM - JPA
>> ์ž๋ฐ” ํผ์‹œ์Šคํ„ด์Šค API(Java Persistence API, JPA)๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€ ORM ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ธฐ์กด์— EJB์—์„œ ์ œ๊ณต๋˜๋˜ ์—”ํ‹ฐํ‹ฐ ๋นˆ(Entity Bean)์„ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. JAP๋Š” 220์—์„œ ์ •์˜๋œ EJB 3.0 ์ŠคํŽ™์˜ ์ผ๋ถ€๋กœ ์ •์˜๊ฐ€ ๋˜์–ด ์žˆ์ง€๋งŒ, JPA๋Š” EJB ์ปจํ…Œ์ด๋„ˆ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉฐ EJB, ์›น ๋ชจ๋“ˆ ๋ฐ Java SE ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ, JPA๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํผ์‹œ์Šคํ„ด์Šค ํ”„๋กœ๋ฐ”์ด๋” ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. - EntityManager
EntityManager em = EntityManagerFactory.getEntityManager();
EntityManager API๋Š” ํ•˜๋‚˜์˜ ํŠน๋ณ„ํ•œ ์ž‘์—… ๋‹จ์œ„์—์„œ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๊ฒƒ์€ ์˜์† ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ƒ์„ฑ์‹œํ‚ค๊ณ  ์ œ๊ฑฐ์‹œํ‚ค๋Š”๋ฐ, ๊ทธ๊ฒƒ๋“ค์˜ PRIMARY KEY ๋™์ผ์„ฑ(identity)๋กœ์„œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์ฐพ๋Š”๋ฐ, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋“ค์— ๋Œ€ํ•ด ์งˆ์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. - create
DatabaseOpenHelper databaseHelper = new DatabaseOpenHelper(this);
EntityManager em = EntityManagerFactory.getEntityManager();
entityManager.createTable(My.class);
- insert / update
EntityManager em = EntityManagerFactory.getEntityManager();
em.getTransaction().begin();
MyClass my = new MyClass(โ€œsomethingโ€);
em.persist(my);
em.getTransaction().commit();
- find
EntityManager em = EntityManagerFactory.getEntityManager();
em.getTransaction().begin();
MyClass my = em.find(My.class, index);
em.getTransaction().commit();
- delete
DatabaseOpenHelper databaseHelper = new DatabaseOpenHelper(this);
EntityManager em = EntityManagerFactory.getEntityManager();
entityManager.dropTable(My.class);
- SQLite / Java Type Mapper
>> ColumnType : UNDEFINED, INTEGER, REAL, NUMERIC, TEXT, BLOB, NONE
  1. Troubleshooting
  2. Annotation recipes
  • Table
    @Table
    public class Music {
    ...
    }
    
  • Column
    @Column
    private String imageUrl;
    @Column
    private boolean isPlaying;
    @Column
    private byte[] bitmap;
    

์†์„ฑ๊ฐ’ : PRIMARY KEY / AUTOINCREMENT

@Column
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
  • OneToOne
    >> ํ…Œ์ด๋ธ”๊ฐ„ 1:1 ๋งคํ•‘์ด ์žˆ์„ ๊ฒฝ์šฐ์— ๊ฐ๊ฐ์˜ Entity ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ํด๋ž˜์Šค๊ฐ„ ๊ด€๊ณ„๋ฅผ OneToOne ๋งคํ•‘์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
@Entity
public class Employee {
   @OneToOne
   private TravelProfile profile;
} 
@Entity
public class TravelProfile {
   @OneToOne
   private Employee employee;
}

์œ„์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด Employee ์™€ TravelProfile๊ฐ€ ๊ฐ๊ฐ OneToOne์ด๋ผ๋Š” Annotation์„ ๊ธฐ์žฌํ•˜์—ฌ ๋งคํ•‘์ฒ˜๋ฆฌํ•œ ๊ฒƒ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.

์ž‘๋™ํ™•์ธ ์ฝ”๋“œ

@Table
public class Music {
...
@Column
@OneToOne
private Event event;
}
  • ManyToOne
    @Column
    @ManyToOne
    private My my;
    
  1. Criteria
  • Criteria API ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
    >> Criteria API๋Š” Criteria๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ์™€ ๊ด€๋ จ๋œ ์กฐ๊ฑด์„ ์ž…๋ ฅํ•œ๋‹ค. ์ฆ‰, Criteria API๋Š” ์ข€๋” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ํ˜•ํƒœ๋กœ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€๋‹ค.
  • Criteria ๊ธฐ๋ณธ ์‚ฌ์šฉ ํ˜•ํƒœ
    >> Criteria API๋Š” net.sf.hibernate.Criteria ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Session.createcriteria() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ๊ฐ–๋Š” Criteria ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    Criteria crit = session.createCriteria(My.class);
    List list = crit.list();
    
  1. [Native Query](Native Query)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ CRUD ์ž‘์—…์„ ํ•  ๋•Œ JPA ๊ธฐ๋ณธ API๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ QL์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • DBMS์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด Native SQL ์‚ฌ์šฉ์„ ์ง€์›ํ•œ๋‹ค.

    entityManager.createNativeQuery() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ Native SQL์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

    JPA SPEC
StringBuffer qlBuf = new StringBuffer(); 
   qlBuf.append("SELECT * ");
   qlBuf.append("FROM DEPARTMENT ");
   qlBuf.append("WHERE DEPT_NAME like :condition ");
   qlBuf.append("ORDER BY DEPT_NAME"); 
   Query query = em.createNativeQuery(qlBuf.toString(),Department.class);
   query.setParameter("condition", "%%"); 
   List deptList = query.getResultList();

์œ„์™€ ๊ฐ™์ด ์ •์˜๋œ SQL๋ฌธ์„ ํ†ตํ•ด ์กฐํšŒ ์กฐ๊ฑด์— ๋งž๋Š” Department ๊ฐ์ฒด์˜ List๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.
WHERE์ ˆ์—์„œ ':'์„ ์‚ฌ์šฉํ•˜์—ฌ Named Paramenter๋ฅผ ํ†ตํ•ด ์กฐํšŒ ์กฐ๊ฑด์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์กฐํšŒ ์กฐ๊ฑด์˜ ๊ฐ’์€ Query์˜ setParameter() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ง€์ •ํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค.
๋˜ํ•œ, createNativeQuery์˜ ๋‘๋ฒˆ์žฌ ์ธ์ž๋กœ ๋ฆฌํ„ด๋ฐ›๊ณ ์žํ•˜๋Š” Entity ํด๋ž˜์Šค(Department.class)๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž‘๋™ํ™•์ธ ์ฝ”๋“œ

Query query = entityManager.createNativeQuery("SELECT * FROM Music WHERE artist = :artist", Music.class);
Music music = (Music) query.setParameter("artist", "Sunyong").getSingleResult();
System.out.println(music);
  1. ์บ์‹œ ํ™œ์šฉ ์ •์ฑ…
  • DB ์—‘์„ธ์Šค๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•œ ์บ์‹œ ๊ธฐ๋Šฅ ์ง€์›
  • persist / find ๋“ฑ์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ง€์›
  • ์–ด๋…ธํ…Œ์ด์…˜ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜์—ฌ Entity ๊ตฌ์กฐ๋ถ„์„ ์†๋„ ํ–ฅ์ƒ
  1. [Get Entity by ID](Get Entity by ID)
  • Method
    javax.persistence.EntityManager
T find(
  Class entityClass,
  Object primaryKey
)

Find by primary key. Search for an entity of the specified class and primary key.
If the entity instance is contained in the persistence context, it is returned from there.

Employee employee = em.find(Employee.class, 1);
Employee managed = employee.getManager();

์ž‘๋™ํ™•์ธ ์ฝ”๋“œ

music = entityManager.find(Music.class, new Long(19));
System.out.println(music);
  1. [Android DB ํ™•์ธํ•˜๊ธฐ](Android DB ํ™•์ธํ•˜๊ธฐ)
โš ๏ธ **GitHub.com Fallback** โš ๏ธ