[Android] DTO? VO? 만들기
DB에 만들어진 필드랑 1:1 대응하는 변수 + getter&setter를 가진 클래스
부르는 의미에 따라서 VO라고 하기도 하고 DTO라고 하기도 한다..
DB에 위와 같은 필드를 가진 경우 DTO클래스 작성은 아래와 같다
public class BoardFilesDTO {
private int idx;
private int ref;
private String oriName;
private String convName;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public String getOriName() {
return oriName;
}
public void setOriName(String oriName) {
this.oriName = oriName;
}
public String getConvName() {
return convName;
}
public void setConvName(String convName) {
this.convName = convName;
}
}
이클립스로 만들 경우 위에 변수 선언 4줄만 만들고
우클릭해서 sources/generate gatters and setters 하고 전체 선택해서 OK하면 알아서 만들어준다 (매우 편함)
그리고 기본적인 DTO는 이게 끝 ;)
필요에 따라서 DB에 없지만 service에서 쓸 변수를 선언할 수 있다 (ex: 게시글 추천수 등)
'게임 개발 초보자 > 안드로이드 연습장' 카테고리의 다른 글
[Android] ListView보다 좋은 것 RecyclerView (0) | 2018.06.05 |
---|---|
[Android] ListView, RecyclerView 데이터 추가할 경우 (0) | 2018.06.05 |
[Android] ExtendableListView 만들기 (0) | 2018.06.04 |
[Android] Gson으로 폴더별로 json파일 읽어오기 (0) | 2018.06.04 |
[Android] res/values 폴더의 xml파일 내용 (0) | 2018.05.31 |
[Spring] 서버 DB에 테이블 만들기(Oracle, MariaDB)
1. 테이블 이름 : board (글)
<필드>
int idx;
String name;
String password;
String subject;
String content;
Date regDate;
String ip;
[오라클 SQL] (create sequence board_idx_seq는 mariaDB의 auto-increment용)
CREATE SEQUENCE board_idx_seq;
CREATE TABLE board(
idx number primary key,
name varchar2(20) not null,
password varchar2(20) not null,
subject varchar2(100) not null,
content varchar2(1000) not null,
regdate timestamp default SYSDATE,
ip varchar2(30) not null
);
[MariaDB SQL]
CREATE TABLE board(
idx number primary key, auto_increment,
name varchar2(20) not null,
password varchar2(20) not null,
subject varchar2(100) not null,
content text not null,
regdate timestamp default now(),
ip varchar2(30) not null
);
2. 테이블 이름 : boardcomment (댓글)
<필드>
int idx;
int ref;
String name;
String password;
String content;
Date regDate;
String ip;
[오라클 SQL]
CREATE SEQUENCE boardcomment_idx_seq;
CREATE TABLE boardcomment(
idx number primary key,
ref number not null,
name varchar2(20) not null,
password varchar2(20) not null,
content varchar2(1000) not null,
regdate timestamp default SYSDATE,
ip varchar2(30) not null
);
[MariaDB SQL] ( default current_timestamp / default now() 대신에 쓸수있다함)
CREATE TABLE boardcomment(
idx number primary key, auto_increment,
ref number not null,
name varchar2(20) not null,
password varchar2(20) not null,
content text not null,
regdate timestamp default now(),
ip varchar2(30) not null
);
3. 테이블 이름 : boardfiles (첨부파일)
<필드>
int idx;
int ref;
String oriname;
String convname;
[오라클 SQL]
CREATE SEQUENCE boardfiles_idx_seq;
CREATE TABLE boardfiles(
idx number primary key,
ref number not null,
oriname varchar2(100) not null,
convname varchar2(100) not null,
);
[MariaDB SQL]
CREATE TABLE boardfiles(
idx number primary key, auto_increment,
ref number not null,
oriname varchar2(100) not null,
convname varchar2(100) not null
);
'게임 개발 초보자 > 초보자의 개발일기' 카테고리의 다른 글
[디자인패턴] 싱글톤으로 클래스 만들기 (0) | 2018.06.28 |
---|---|
[Spring Security4] HelloWorld Test (0) | 2018.06.05 |
[Spring] 게시판에 페이지 기능 추가하기 Paging (Oracle) (0) | 2018.06.04 |
[Spring] Mybatis 설정 (0) | 2018.06.04 |
[Spring] Filter를 이용해 한글 안깨지게 인코딩하기 (0) | 2018.06.04 |
[Spring] Mybatis 설정
1. pom.xml에 Mybatis dependency 추가
<!-- Mybatis 추가 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<!-- JDBC DB 쓸거라서 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
2. main/resources/db.properties 파일 만들기
- 주황색으로 된 부분은 만든 순서대로 MariaDB 이름, DB에 접속할 ID, DB에 접속할 비밀번호
**(이부분을 처음에 마리아DB나 오라클 설치할때 세팅한 DB이름,ID,비밀번호로 쓰면된다)
# Maria DB \uc815\ubcf4
# \uc77c\ubc18 \uc124\uc815
m.driver=org.mariadb.jdbc.Driver
m.url=jdbc:mariadb://localhost:3306/jspdb
# \ucffc\ub9ac \ud655\uc778
# m.driver=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# m.url=jdbc:log4jdbc:mariadb://localhost:3306/jspdb
m.username=jspuser
m.password=0000
#=========================================================
# Oracle DB \uc815\ubcf4
# \uc77c\ubc18 \uc124\uc815
o.driver=oracle.jdbc.driver.OracleDriver
o.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
# \ucffc\ub9ac \ud655\uc778 : log4jdbc-remix
# o.driver=net.sf.log4jdbc.DriverSpy
# o.url=jdbc:log4jdbc:oracle:thin:@127.0.0.1:1521:XE
o.username=jspuser
o.password=0000
3. src/main/webapp/WEB-INF/spring/root-context.xml 파일에 Mybatis 설정 추가
<!-- mybatis -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 아래부분은 매핑할 xml파일이 있는 패키지경로를 설정한다. -->
<property name="typeAliasesPackage"
value="kr.ezen.mvc9.files.dto" />
<property name="mapperLocations"
value="classpath:mapper/*.xml" />
</bean>
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory"
ref="sqlSessionFactory" />
</bean>
<!-- DB를 쓰기 위해 프로퍼티 파일 사용!!! -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- dataSource 설정, spring-jdbc 모듈 사용, spring 에서 jdbc 를 통해 Oracle 에 접속할 수 있게 함 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${o.driver}"/>
<property name="url" value="${o.url}"/>
<property name="username" value="${o.username}"/>
<property name="password" value="${o.password}"/>
</bean>
<!-- OJDBC 오라클 DB사용하기 위해서 추가 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
이후에 Mapper, DTO, DAO, Service, Controller를 이용하여 Mybatis 사용 가능
예제 다운로드 (비밀번호 확인용 글 http://pumdaf.tistory.com/entry/Spring-BasicMybatiszip)
'게임 개발 초보자 > 초보자의 개발일기' 카테고리의 다른 글
[디자인패턴] 싱글톤으로 클래스 만들기 (0) | 2018.06.28 |
---|---|
[Spring Security4] HelloWorld Test (0) | 2018.06.05 |
[Spring] 게시판에 페이지 기능 추가하기 Paging (Oracle) (0) | 2018.06.04 |
[Spring] 서버 DB에 테이블 만들기(Oracle, MariaDB) (0) | 2018.06.04 |
[Spring] Filter를 이용해 한글 안깨지게 인코딩하기 (0) | 2018.06.04 |
[Spring] Filter를 이용해 한글 안깨지게 인코딩하기
src/main/webapp/WEB-INF/web.xml 파일에 필터 추가
<!-- 인코딩 필터만 추가!!! -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
필터를 추가해놓으면 모든 페이지가 필터를 거쳐서 실행된다
즉, 모든 페이지가 UTF-8로 인코딩된 후 실행된다는 의미
한글이 안깨지게 된다
'게임 개발 초보자 > 초보자의 개발일기' 카테고리의 다른 글
[디자인패턴] 싱글톤으로 클래스 만들기 (0) | 2018.06.28 |
---|---|
[Spring Security4] HelloWorld Test (0) | 2018.06.05 |
[Spring] 게시판에 페이지 기능 추가하기 Paging (Oracle) (0) | 2018.06.04 |
[Spring] 서버 DB에 테이블 만들기(Oracle, MariaDB) (0) | 2018.06.04 |
[Spring] Mybatis 설정 (0) | 2018.06.04 |
[Android] ExtendableListView 만들기
<결과>
<결과>
맨 처음 보여지는 리스트 = 부모리스트(GroupList)
부모를 클릭했을 때 나오는 리스트 = 자식리스트(ChildList)
1. 읽어올 Json파일의 VO(DTO)를 만든다
public class Chunja2 {
private int idx;
private String h;
private String k;
private String t;
public class Chunja {
private int idx;
private String h;
private String k;
private String m;
** VO(DTO)는 1:1 대응하는 데이터 + getter&setter만 만들어놓은 것
2. GroupView(리스트 중 부모)의 모양을 결정하는 Layout을 만들어준다 (res/layout/group.xml)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/parentTV1"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:text="나는 한자"
android:textSize="12pt"
android:padding="5dp"
android:layout_marginLeft="30dp"/>
<TextView
android:id="@+id/parentTV2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="나는 음"
android:textSize="11pt"
android:padding="5dp"/>
</LinearLayout>
<TextView
android:id="@+id/parentTV3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="나는 뜻"
android:textSize="9pt"
android:padding="5dp"
android:layout_marginLeft="30dp"/>
</LinearLayout>
3. ChildView(리스트 중 자식)의 모양을 결정하는 Layout을 만들어준다 (res/layout/child.xml)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/childTV1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:text="한자"
android:textSize="12pt"
android:padding="5dp"
android:layout_marginLeft="50dp"/>
<TextView
android:id="@+id/childTV2"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="뜻"
android:textSize="12pt"
android:padding="5dp"
android:gravity="right"
/>
</LinearLayout>
4. 각각의 View를 만들어준다 (부모View, 자식View)
[부모View]
**만든 layout파일을 가져올때는 LayoutInflater를 사용한다 (Class에 LinearLayout을 상속받아야함)
inflater.inflate(R.layout.만든파일이름,this,true)를 통해 만든 layout파일에 있는 id에 접근가능해짐
[자식View]
5. ListView에 붙일 Adapter를 만들어준다 (Class에 BaseExpandableListAdapter를 상속받아야함)
public class ChunjaAdapter extends BaseExpandableListAdapter{
private Context context;
private List<Chunja2> groupList = new ArrayList<>();
private List<List<Chunja>> childList = new ArrayList<>();
부모리스트에 붙일 데이터 타입과 자식리스트에 붙일 데이터 타입을 먼저 선언
public ChunjaAdapter(Context context, List<Chunja2> groupList, List<List<Chunja>> childList) {
this.context = context;
this.groupList = groupList;
this.childList = childList;
}
생성자를 만든다
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return childList.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childList.get(groupPosition).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
메소드 오버라이딩 하여 return값을 지정해준다
getGroupCount() : 부모의 size
getChildrenCount() : 자식의 size (childList의 groupPosition위치를 통해 groupPosition 번째 부모의 자식~으로 접근가능)
getGroup() : 선택된 groupPosition의 객체 반환
getChild() : 선택된 childPosition의 객체 반환 (마찬가지로 groupPosition 번째 부모의 childPosition번째 자식으로 접근)
getGroupId() : groupPosition 반환
getChildId() : childPosition 반환
hasStableIds() : 뭔지 모르겠으나 안손댐
isChildSelectable() : 리턴이 false면 clickLister 안먹혀서 return true로 지정
6. getGroupView와 getChildView를 오버라이딩 해준다
먼저 선택된 리스트의 데이터를 읽어온다
반환할 View를 만든다
화면에 보여지는 convertView가 없으면 if (convertView == null)
new로 View를 만들어준다 groupView = new Chunja2View(context,data)
convertView가 있으면 else
해당 convertView를 재사용한다 groupView = (Chunja2View) convertView
재사용할때는 데이터세팅도 함께 groupView.setChunja(data)
7. MainActivity에서 만든 Adapter를 new하여 ExpandableListView에 setAdapter로 붙인다
'게임 개발 초보자 > 안드로이드 연습장' 카테고리의 다른 글
[Android] ListView, RecyclerView 데이터 추가할 경우 (0) | 2018.06.05 |
---|---|
[Android] DTO? VO? 만들기 (0) | 2018.06.04 |
[Android] Gson으로 폴더별로 json파일 읽어오기 (0) | 2018.06.04 |
[Android] res/values 폴더의 xml파일 내용 (0) | 2018.05.31 |
[Android] Notitle, FullScreen 설정 (0) | 2018.05.31 |
[Android] Gson으로 폴더별로 json파일 읽어오기
Gson을 사용할 경우 Open Module Settings의 dependencies에서 gson을 미리 추가할것!!
(오른쪽의 +버튼 누르고 Library Dependency에서 gson 검색)
main.xml 에서 ExpandableListView를 만듬 (id:elv)
ExpandableListView elv;
List<Chunja2> groupList = new ArrayList<>(); // 부모
List<List<Chunja>> childList = new ArrayList<>(); // 자식
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
elv = findViewById(R.id.elv);
Gson gson = new Gson();
try {
// 부모 읽기
InputStream is = getResources().openRawResource(R.raw.chunja2);
InputStreamReader isr = new InputStreamReader(is,"UTF-8");
groupList = gson.fromJson(isr,new TypeToken<List<Chunja2>>(){}.getType());
// 자식읽기
InputStream is2 = getResources().openRawResource(R.raw.chunja);
InputStreamReader isr2 = new InputStreamReader(is2,"UTF-8");
List<Chunja> list = gson.fromJson(isr2,new TypeToken<List<Chunja>>(){}.getType());
// 4개씩 자식으로 만들기
for(int i=0;i<list.size();i+=4){
List<Chunja> list2 = new ArrayList<>();
list2.add(list.get(i));
list2.add(list.get(i+1));
list2.add(list.get(i+2));
list2.add(list.get(i+3));
childList.add(list2);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
ChunjaAdapter adapter = new ChunjaAdapter(this,groupList,childList);
elv.setAdapter(adapter);
}
InputStream의 getResources().openRawResource를 이용해 json 파일을 연다
위에서 만든 IS로 InputStreanReader를 만든다 ("UTF-8"을 붙여줘야 한글이 안깨짐)
fromJson을 이용해 파일을 읽어온다 (new TypeToken 쓰는 방법 주의)
Raw폴더의 경우 getResources().openRawResource 사용
assets 폴더의 경우 getAssets().open("chunja2.json");
'게임 개발 초보자 > 안드로이드 연습장' 카테고리의 다른 글
[Android] ListView, RecyclerView 데이터 추가할 경우 (0) | 2018.06.05 |
---|---|
[Android] DTO? VO? 만들기 (0) | 2018.06.04 |
[Android] ExtendableListView 만들기 (0) | 2018.06.04 |
[Android] res/values 폴더의 xml파일 내용 (0) | 2018.05.31 |
[Android] Notitle, FullScreen 설정 (0) | 2018.05.31 |
[Android] res/values 폴더의 xml파일 내용
단순 리소스 정보들은 res/values/*.xml 파일로 정의한다
파일 이름이 지정되어 있는 것은 아니며 xml파일 위치는 반드시 res/values 밑에 있어야 한다
1. 문자열 리소스 정보
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">appName</string>
</resources>
!! <resources> 를 루트로 사용
!! 문자열 리소스 정의할 경우 <string>을 사용
2. 문자열 배열 리소스 정보
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="array1">
<item>사과</item>
<item>포도</item>
<item>딸기</item>
</string-array>
</resources>
!! <string-array>를 사용하고 데이터는 <item>으로 정의
3. 색상 리소스 정보
!!<color> 사용
!!비트수 + 알파값으로 데이터 형태는 4가지
#RGB , #ARGB, #RRGGBB, #AARRGGBB
일반적으로는 #RRGGBB나 #AARRGGBB를 많이 쓰는듯 (ex: #ffdde1, #22ffdde1)
4. 크기 리소스 정보
!!<dimen> 사용
!! 크기 단위 : px,in,mm,pt,dp,sp
dp나 sp쓰는듯..
5. 이미지 리소스
탐색기에서 복사(ctrl+c) 한다음에 drawble 폴더 밑에다가 붙여넣기(ctrl+v)하고 엔터누르면 들어감
배경이미지 같은 경우 9-patch 이미지 권장
(9-patch 이미지 : 이미지 만들고 1픽셀 늘려서 늘어나도 되는 곳만 검정색으로 칠하고 파일 이름 하고 확장자 사이에 .9를 붙인다 sample.9.png 이런식으로)
draw9patch 툴로 png파일을 9-patch png로 변경도 가능한 듯 (안해봄)
6. xml 리소스
!!res/xml 경로 밑에 넣으면 됨
7. 기타 원본 리소스
res/raw 밑에 넣으면 됨
8. 디렉토리에 한정자 붙여서 지역별로 리소스 관리 가능
res/values-en : 영어 리소스
res/values-kr : 한글 리소스
ISO 639-1 언어코드 기준으로 사용하면 된다
'게임 개발 초보자 > 안드로이드 연습장' 카테고리의 다른 글
[Android] ListView, RecyclerView 데이터 추가할 경우 (0) | 2018.06.05 |
---|---|
[Android] DTO? VO? 만들기 (0) | 2018.06.04 |
[Android] ExtendableListView 만들기 (0) | 2018.06.04 |
[Android] Gson으로 폴더별로 json파일 읽어오기 (0) | 2018.06.04 |
[Android] Notitle, FullScreen 설정 (0) | 2018.05.31 |
[Android] Notitle, FullScreen 설정
android:windowFullscreen = 풀스크린 설정
windowNoTitle = 타이틀바 안보이기
true/false로 설정가능한듯
**버전에 따라서 android:windowNoTitle도 쓰고 그러는듯.. 쓰기전에 찾아보고 쓰자!
'게임 개발 초보자 > 안드로이드 연습장' 카테고리의 다른 글
[Android] ListView, RecyclerView 데이터 추가할 경우 (0) | 2018.06.05 |
---|---|
[Android] DTO? VO? 만들기 (0) | 2018.06.04 |
[Android] ExtendableListView 만들기 (0) | 2018.06.04 |
[Android] Gson으로 폴더별로 json파일 읽어오기 (0) | 2018.06.04 |
[Android] res/values 폴더의 xml파일 내용 (0) | 2018.05.31 |
[Unity3D] 랜덤함수 원하는만큼 추출
Random.Range(float min,float max);
-> min부터 max미만의 정수 추출
1~10까지 숫자 추출하려면 Random.Range(1, 11);
1~50까지 숫자 추출하려면 Random.Range(1, 51);
**max 미만의 정수추출이므로 범위계산이 중요**
[네오봄버맨 캐릭터추첨 프로그램에 사용]
float min = 1;
float max = 12; //캐릭터가 12종류
Random.Range(min,max+1);
-> 캐릭터 12가지 중 한가지가 선택됨