IntelliJ에서 SVN을 연결하여 프로젝트 파일을 관리하고 공유하는 방법에 대해 알아봅니다.

IntelliJ 설치와 프로젝트 생성 그리고 VisualSVN 설치와 관리 방법은 이전에 작성한 글을 참고하고

IntelliJ IDEA 2023.3
설치 프로젝트 생성


VisualSVN Server 5.3.1 Repository
생성 및 User Group 관리

 

여기서는 IntelliJ에서 SVN에 연결하여 프로젝트들을 Share하고 Commit 하는 방법에 대해 설명합니다.

 

 

1. IntelliJ SVN 프로그램 연결

 

IntelliJ에서 svn 프로그램을 사용할 수 있도록 연결해 주어야 별도의 SVN 프로그램을 사용하지 않고 바로 CommitUpdate를 할 수 있습니다.

먼저 IntelliJ를 실행합니다.

 

 

IntelliJ 설치를 설명할 때 생성해 놓은 Sample 프로젝트가 보이는군요.

 

SVN 프로그램을 연결하려면 먼저 프로그램이 설치되어 있어야겠죠.

VisualSVN에는 Apache Subversion이 포함되어 있다고 VisualSVN 설치할 때 설명 드렸는데 진짜인지 확인을 해볼까요?

 

 

 

VisualSVN이 설치된 폴더(C:\Program Files\VisualSVN Server\bin)에 가보면 svn.exe 파일이 있는것을 확인할 수 있습니다.

IntelliJsvn.exe 파일을 등록해주면 이 프로그램을 이용하여 파일을 관리하게 됩니다.

svn 파일은 기존에 Tortoise SVN등 다른 프로그램을 설치하였으면 그것을 이용해도 됩니다.

 

등록을 진행해봅니다.

 

 

 

상위 메뉴에서 File > Settings... 메뉴를 선택하여 Settings 팝업을 오픈합니다.

 

 

 

Settings 팝업 좌측에서 Version Control > Subversion 메뉴를 선택 하면 우측에 Path to Subversion executable 항목이 보입니다.

입력란 끝에 있는 폴더 모양 아이콘을 클릭하여 Subversion 팝업을 오픈합니다.

 

 

 

Subversion 팝업 창 화면이 나타나면 여기서 svn.exe 파일을 선택하고 [OK] 버튼을 클릭해 줍니다.

 

 

 

하단에 있는 [Apply] 버튼과 [OK] 버튼을 클릭하여 설정을 반영하면 등록이 완료됩니다.

 

 

2. SVN Repository 연결

 

이제 프로젝트를 저장할 SVN Repository를 연결합니다.

VisualSVN에서 Repository를 생성할 때 위치 접속 정보를 알려주는데 이 주소를 사용하면 됩니다.

저장소 생성시 나오는 화면을 잠시 보면

 

 

 

Repository URL 항목에 주소와 Repository 명칭의 조합으로 되어있습니다.

URL을 등록하면 연결이 됩니다.

 

 

 

IntelliJ 상단 메뉴에서 VSC > Browse VCS Repository > Browse Subversion Repository... 를 선택하면 IntelliJ 하단에 SVN Repositories 창이 나타납니다.

 

 

 

여기서 좌측에 있는 [+] 모양을 클릭하면 Repository 주소를 입력할 수 있는 창이 나타납니다.

 

 

 

팝업 창에 Repository 주소를 입력하고 [OK] 버튼을 클릭합니다.

 

 

 

주소가 하나 추가되었습니다.

 

 

3. Project Share

 

 

이제 연결된 Repository에 테스트로 생성한 Sample1 프로젝트를 처음으로 share 해보도록 합니다.

 

 

 

상단 메뉴에서 VCS > Share Project (Subversion)... 을 선택하면 창이 하나 나타납니다.

 

 

 

프로젝트를 Share할 레포지토리를 선택하고 하단 입력 창(commit comment)에 간단한 내용를 작성하고 [Share] 버튼을 클릭합니다.

 

 

 

Subversion 포맷은 가장 최신 것으로 선택 하는게 좋겠죠.  [OK] 버튼을 클릭합니다.

 

 

 

VisualSVN에서 User 생성시 사용한 ID와 비밀번호를 입력해 줍니다.

[Save credentials] 체크하고 [OK] 버튼을 클릭합니다.

 

 

 

Share Directory 작업이 진행됩니다.

 

 

 

Sample1 프로젝트 Share Directory 작업이 완료 되었습니다.

 

 

 

vcs.xml에 등록을 하라고 하는데 [Add] 버튼을 클릭합니다.

 

 

4. File Commit

 

이제 파일을 commit 합니다.

위에서 작업한건 Share Directory이지 file을 올린건 아닙니다.

 

 

Sample1 Project에 마우스를 대고 우클릭 해서 Subversion > Commit Directory... 를 클릭하면 Commit Changes 팝업 창이 나타납니다.

 

 

 

이 창에서 commit 하려는 파일을 선택 또는 취소하고 변경된 부분을 확인하는 등의 작업을 할 수 있습니다.  처음 commit 작업이므로 모든 파일을 선택 합니다.

간단하게 Commit Message를 입력하고 [Commit] 버튼을 클릭하면 commit이 진행됩니다.

 

 

 

commit 완료 후 하단 SVN Repositories를 보면 Project 파일이 올라가 있는걸 볼 수 있습니다.

 

 

여러 개의 Project를 올리면 어떤 모습인지 보기위해 프로젝트를 하나 더 생성해서 동일한 작업을 진행해봅니다.

 

Sample2 라는 프로젝트를 생성해서 동일한 작업을 반복하여 중간 과정은 생략하고 Share 하는 단계부터 설명 합니다.

 

 

 

Repository를 선택하고 간단한 Comment를 작성한 후 Sample2 프로젝트를 Share 합니다.

 

 

 

포맷을 정하고

 

 

 

Share Directory가 진행됩니다.

 

 

 

SVN Repositories 에서 Share Directory 후의 모습입니다.

commit을 하지 않아 trunk 폴더에 소스가 올라가있지 않습니다.

 

commit을 진행합니다.

 

 

 

Commit Message를 입력하고 Commit 버튼을 클릭합니다.

 

 

 

Commit이 완료되고 하단의 SVN Repositories 영역에서 마우스를 우클릭하여 리프레쉬 해보면

 

 

 

Sample2 프로젝트에도 파일이 올라간걸 확인할 수 있습니다.

 

 

 

VisualSVN 프로그램을 실행해서 지금까지 진행한 작업이 잘 되었는지 확인해봅니다.

모든 작업이 잘 완료되었습니다.

 

- copy coding -

 


android에서 사용하는 여러 저장 방법 중 간단하게 사용할 수 있는 기능 입니다.

개발에 필요한 크지 않은 변수와 값들을 내부에 저장하기에 적당합니다.

key-value 형식으로 저장이 됩니다.

 


1. SharedPreferences

 

SharedPreferences에서 사용하는 상수와  Method들 입니다.

그냥 이런게 있구나 하고 보시고 필요시 사용하면 됩니다.

 

1.1 Constants


SharedPreference Constants


Type

Constant

Description

int

MODE_APPEND

기존 preferences 신규 preferences 추가

int

MODE_MULTI_PROCESS

이미 호출되어 사용 중인지 체크

int

MODE_PRIVATE

생성한 application에서만 사용 가능

int

MODE_WORLD_READABLE

다른 application에서 읽을 있음

int

MODE_WORLD_WRITEABLE

다른 application에서 기록할 있음

 


1.2 Methods


SharedPreference Methods

 

Type

Method

abstract boolean

contains(String key)

- 키 값이 들어있는지 체크

abstract SharedPreferences.Editor

edit()

- 신규 Editor를 생성

abstract Map

getAll()

- 저장된 모든 값을 검색

abstract boolean

getBoolean(String key, boolean defValue)

- 키에 해당하는 boolean 값 검색

abstract float

getFloat(String key, float defValue)

- 키에 해당하는 float 값 검색

abstract int

getInt(String key, int defValue)

- 키에 해당하는 int 값 검색

abstract long

getLong(String key, long defValue)

- 키에 해당하는 long 값 검색

abstract String

getString(String key, String defValue)

- 키에 해당하는 set 형태의 string 값 검색

abstract Set

getStringSet(String key, Set defValues)

- 키에 해당하는 boolean 값 검색


1.3 Editor Methods


SharedPreference.Editor Methods

 

Type

Method

abstract void

apply()

- 비동기 적으로 값을 저장 한다

abstract SharedPreferences.Editor

clear()

- 모든 값을 삭제 한다.

abstract boolean

commit()

- 동기 적으로 값을 저장 하고 결과를 리턴 한다

abstract SharedPreferences.Editor

putBoolean(String key, boolean value)

- bool 값을 설정 한다

abstract SharedPreferences.Editor

putFloat(String key, float value)

- float 값을 설정 한다

abstract SharedPreferences.Editor

putInt(String key, int value)

- int 값을 설정 한다

abstract SharedPreferences.Editor

putLong(String key, long value)

- long 값을 설정 한다

abstract SharedPreferences.Editor

putString(String key, String value)

- string 값을 설정 한다

abstract SharedPreferences.Editor

putStringSet(String key, Set values)

- set  값을 설정 한다

abstract SharedPreferences.Editor

remove(String key)

- key 해당하는 값을 삭제 한다

 

* putxxx() 작업은 반영을 위해 commit() 또는 apply()를 호출해야 합니다.

* remove()는 반영을 위해 commit()을 호출 해야 합니다.



2. 프로그램 설명

 

간단히 사용하는 저장 공간이기 때문에 설치하는 것도 없고

핸들만 얻어서 사용하면 됩니다.

 

2.1 Handle 얻기


getSharedPreferences() : 여러개의 Shared Preference 파일들을 사용 하는 경우

getPreferences() : 한개의 Shared Preference 파일을 사용하는 경우.

 

여기서는 첫번째 getSharedPreferences()를 사용 합니다.

정의는

public abstract SharedPreferences getSharedPreferences (String name, int mode)

이렇게 되어 있고


사용은

SharedPreferences sharePref = getSharedPreferences("SHARE_PREF", MODE_PRIVATE);

이렇게 합니다.


SHARE_PREF라는 이름의 저장소를 생성한 application에서만

사용가능 모드로 사용하기 위해 생성합니다.

만일 SHARE_PREF 라는파일이 없으면 신규로 생성 합니다.


 버튼을 클릭하면 작업을 하고 바로 리스트를 가져오도록 되어있습니다.

 

2.2 Data 저장


Editor를 이용하여 저장 합니다.

SharedPreferences.Editor editor = sharePref.edit();

각각의 데이터 타입별로 저장해 보았습니다.

public void saveData() {
    editor.putBoolean("isShare", true);
    editor.putFloat("fRate", 1.33f);
    editor.putInt("nValue", 100);
    editor.putString("name", "copycoding");
    editor.apply();

}

2.3 Data 수정


저장과 같은 방식으로 값만 변경하면 됩니다.

public void updateData() {
    editor.putBoolean("isShare", false);
    editor.putFloat("fRate", 3.33f);
    editor.putInt("nValue", 5000);
    editor.putString("name", "copycoding.tistory");
    editor.apply();
}

2.4 Data 삭제


remove()key값을 적어주면 됩니다.

public void deleteData() {
    editor.remove("nValue");
    editor.commit();
}

2.5 불러오기


최초 생성한 핸들(여기서는 sharePref)을 이용해서 불러옵니다.

public void listData() {
    String dataList = "";
    Map totalValue = sharePref.getAll();
    for(Map.Entry entry : totalValue.entrySet()) {
        dataList += entry.getKey().toString()+ ": " + entry.getValue().toString() + "\r\n";
        Log.d("share : ", entry.getKey() + ": " + entry.getValue());
    }
    tvList.setText(dataList);
}


저는 자동으로 출력하려고 만든거고 하나씩 가져오려면

sharePref.getString(“name”, “”);

이렇게 하면 됩니다.

뒤에 “”이건 default 값을 적어주는 것입니다.

 

 

3. Source Code

 

3.1 activity_main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_onclick1"
        android:text="Save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="50dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="btnClick"/`
    <Button
        android:id="@+id/btn_onclick2"
        android:text="Update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="50dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="btnClick"/>
    <Button
        android:id="@+id/btn_onclick3"
        android:text="Delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="190dp"
        android:layout_marginTop="50dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="btnClick"/>
    <Button
        android:id="@+id/btn_onclick4"
        android:text="Clear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="280dp"
        android:layout_marginTop="50dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:onClick="btnClick"/>

    <TextView
        android:id="@+id/tvList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SharedPreferences Test"
        android:layout_marginTop="100dp"
        android:textSize="25dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>


3.2 MainActivity.java


package copycoding.android.app.sharedprefer;

import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

    static private String SHARE_NAME = "SHARE_PREF";
    static SharedPreferences sharePref = null;
    static SharedPreferences.Editor editor = null;
    TextView tvList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvList = (TextView)findViewById(R.id.tvList);

        sharePref = getSharedPreferences(SHARE_NAME, MODE_PRIVATE);
        editor = sharePref.edit();
    }

    public void btnClick(View view) {
        if(view.getId() == R.id.btn_onclick1) {  // Buttoon의 ID를 찾아서 실행이 된다.
            saveData();
        } else if(view.getId() == R.id.btn_onclick2) {
            updateData();
        } else if(view.getId() == R.id.btn_onclick3) {
            deleteData();
        } else if(view.getId() == R.id.btn_onclick4) {
            editor.clear();
            editor.commit();
        }
        listData();
    }

    public void saveData() {
        editor.putBoolean("isShare", true);
        editor.putFloat("fRate", 1.33f);
        editor.putInt("nValue", 100);
        editor.putString("name", "copycoding");
        editor.apply();

    }

    public void updateData() {
        editor.putBoolean("isShare", false);
        editor.putFloat("fRate", 3.33f);
        editor.putInt("nValue", 5000);
        editor.putString("name", "copycoding.tistory");
        editor.apply();
    }

    public void deleteData() {
        editor.remove("nValue");
        editor.commit();
    }

    public void listData() {
        String dataList = "";
        Map<String, ?> totalValue = sharePref.getAll();
        for(Map.Entry<String, ?> entry : totalValue.entrySet()) {
            dataList += entry.getKey().toString()+ ": " + entry.getValue().toString() + "\r\n";
            Log.d("share : ", entry.getKey() + ": " + entry.getValue());
        }
        tvList.setText(dataList);
    }
}


4. 결과


각각의 버튼에 대한 화면 입니다.

버튼을 클릭하면 기능을 수행하고 바로 결과에 대한 리스트를 출력합니다.



android data sharedpreferences



5. APK


다운받아 테스트를 해봅니다.


SharePref.apk


- copy coding -


1

+ Recent posts