마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

execSQL과 rawquery 메서드 인자

0 추천
execSQL의 인자는 Object 배열을 사용할 수 있는데

rawquery의 인자는 String 배열을 사용하도록 고정돼 있는 이유가 뭔가요??

변수를 이용해 쿼리문을 작성하기 위해서 사용한다면 Object 배열이 더 편한게 아닌가요??
ㅇㅇㅇㅇㅇㅇㅇㅇ (1,000 포인트) 님이 2022년 2월 21일 질문

1개의 답변

+1 추천
 
채택된 답변
글쎄요. 이유는 해당 메소드를 디자인한 개발한 개발자에게 물어봐야 정확하게 알 수 있을 것 같습니다.

개인적인 관점으로는 다른 개발자가 작업을 했거나, 한사람이 했다면 일관적이지 않은 디자인처럼 보일 수 있을 것 같습니다.

그리고 둘 중에 String[]을 사용하는 쪽이 더 좋은 디자인이라 생각됩니다. 이유는 SQL을 좀 안다면 메소드의 선언형태만 보고도 사용법을 알 수 있는게 좋은데, Object[]를 넘기는 것은 Primitive type의 wrapper인 Integer, Float, Double 이런 종류는 문제가 없겠지만, 커스텀 오브젝트의 경우는  Object.toString()을 구현해야 되는 걸로 보이기 때문에 이 구현을 빼먹거나 하면 문제가 될 수도 있고, 이미 toString()을 다르게 사용하고 있거나 다른 목적으로(예를 들면, 화면 출력같은) 사용할 경우, 사용 목적 상의 충돌이 있을 수 있습니다. 무엇보다도 Object를 SQL 넘길 수 있다는 약간 잘못된 인상을 주기때문에 내부적으로 어떻게 처리가 되는지 해당 메소드를 사용하는 쪽에서 소스를 확인하는 등의 작업을 거쳐야만 하는 문제가 있습니다. 소스코드를 열어보고 라이브러리 메소드를 사용해야 한다면, 바람직한 디자인은 아니라는 생각이 듭니다.

대신 String[]넘기는 건 의도가 명확해 보입니다.

좀 더 사견을 붙이자면, 안드로이드 라이브러리에 있는 HttpUrlConnection이나 안드로이드 SQLLite 라이브러리 같은 경우는 초창기에 대체할 만한 쓸만한 라이브러리가 없던 시절에 사용하던 일종의 레거시입니다. 가능하다면 RoomDB나  SQLDelight같은 훨씬 잘 설계된 라이브러리를 사용시라고 권장드려요. 안드로이드에서 제공하는 라이브러리를 사용하기에 복잡하기만 할 뿐 익혀서 별 이득이 없습니다. 안드로이드 외에는 써먹을 곳도 없고, 쓸데없는 코드만 더 작성해야 하죠. 대신 SQL 이나 DB 설계를 공부하는 게 안드로이드말고도 다른 곳에서도 동일하게 사용할 수 있으므로 이 부분을 많이 공부하는게 훨씬 낫습니다. 라이브러리는 더 잘 설계된 걸 쓰는게 시간낭비 안하는 길이라고 생각합니다.
spark (227,830 포인트) 님이 2022년 2월 21일 답변
ㅇㅇㅇㅇㅇㅇㅇㅇ님이 2022년 2월 21일 채택됨
execSQL을 찾아보면 SELECT/INSERT/UPDATE/DELETE가 아닌 쿼리에 사용하라고 나옵니다. CREATE TABLE 같은 경우요, 그리고 이걸 사용하는 예제들을 찾아보면 Object[] 파라미터를 사용하는 메소드 보다 그냥 sql 문만 파라미터로 받는 예제들이 대부분입니다.
언제나 궁금증을 해결해 주셔서 감사합니다
확실히 Object 형식으로 넣으면 모든 클래스마다 Object 리턴형식을 사용할 수 있게 만들어야 하니 번거롭겠군요
그리고 요즘은 안드로이드에서 현업에서 sqlite는 전혀 사용하지 않나요?
말씀해 주신 부분은 제가 배우는 중에는 어디서도 들을 수 없었던 정말 귀중한 정보네요
구글에서 여러 클래스나 메서드들을 수시로 Deprecated 시키는걸 보고 조금 번거롭긴 했지만 구글에서 관리하는 것이니까 남은 기능들은 구글이 인정한 최선의 선택지라 생각하고 사용하고 있었는데...
아시겠지만 정확히 말씀드리면 SQLite는 Database이고 SQLiteHelper가 라이브러리에 있는 클래스 이름입니다. SQLite는 계속 사용되고 있습니다. RoomDB도 SQLite를 사용하기 좋게 만든 라이브러리입니다. 안드로이드와 IOS에서 사용하는 DB는 SQLite입니다.
그리고 개발자들이 사용하는 대세는 세계적으로 RoomDB이고 RoomDB도 구글라이브러리이고 계속 사용하라고 프로모션을 하고 있습니다. SQLiteHelper는 개인적으로 볼 때 굳이 사용할 이유가 없다고 봅니다.
...