관리자 페이지에서는 사용자가 정의한 모델에 대한 기본적인 CRUD 기능을 제공한다. 

그러나 때로는 사용자가 직접 원하는 기능을 추가하고 싶을 수 있다. 

이를 위해서 장고에서는 어드민(관리자) 페이지 커스터마이징 기능도 제공한다. 

 

관리자 페이지 커스터마이징 작업은 admin.py 파일에서 이루어진다. 

우선 각 모델에 해당하는 모델 관리자 클래스를 만들어 놓자. 

 

대략적으로 admin.py 에서 정의한 모델 클래스는

 

추가적인 옵션

class ObjectAdmin(매개변수, 여러 개가 들어갈 수도 있다):

    필드들(optional)

    함수들(optional)

 

이렇게 구성된다. 

 

 

admin.ModelAdmin

장고 어드민 인터페이스의 구현체라고 한다. 

정확히 무슨 말인지는 모르겠다!

[이해하면 포스팅하기]

 

 

register

modelAdmin을 등록하기 위해서는 register 선언을 해 주어야 한다. 

admin 파일에 코드를 작성한 뒤, 작성한 내용을 관리자 페이지에 반영하기 위해서 필요한 작업이다. 

작성한 modelAdmin을 register으로 등록하는 방법은 두 가지가 있다. 

 

1. 메소드 사용하기

admin.site.register(모델, 모델 어드민 클래스)

class AuthorAdmin(admin.ModelAdmin):
    // code
    
admin.site.register(Author, AuthorAdmin)

 

2. 데코레이터(decorator) 사용하기

장고에서 @을 사용하여 추가적인 기능을 제공하는 것을 데코레이터(decorator)라고 한다. 

 

@admin.register(모델)

class 모델 어드민 클래스(admin.ModelAdmin):

    // 세부 코드

@admin.register(Author):
class AuthorAdmin(admin.ModelAdmin):
	// code

 

또한 하나의 어드민 클래스에서 여러 모델을 관리할 수도 있기 때문에, 여러 개의 모델을 입력할 수도 있다. 

 

@admin.register(모델1, 모델2, 모델3)

class 모델 어드민 클래스(admin.ModelAdmin):

    // 세부 코드

 

 

관리자 페이지가 다른 어플리케이션과 연결되는 원리

settings.pyINSTALLED_APPS 필드에는 기본값으로 django.contrib.admin이 추가되어 있다. 

이 클래스가 settings.py에 추가되어 있다면, 앱(어플리케이션, 서버)이 시작하자마자 django.contrib.admin 클래스의 모듈은 INSTALLED_APPS 안에 있는, admin을 사용하는 다른 앱에 import 된다. 

 

이게 가능한 이유는 django.contrib.admin의 autodiscover() 함수 때문이다. 

autodiscover() 메소드는서버가 시작하자마자 INSTALLED_APPS에 등록된 다른 앱에서 admin을 사용하는 모델을 찾고, 그 모델들을 관리자 사이트에 등록시킨다. 

 

autodiscover() 메소드는 서버 시작 시 모든 admin에 등록할 모델들을 자동으로 불러오지만, 관리자 페이지를 커스터마이징했을 때 일부 상황에서는 이 기능이 필요하지 않을 수 있다. 

 

autodiscover() 메소드를 사용하고 싶지 않다면, django.contrib.admin 클래스 하위에 있는 apps.SimpleAdminConfig 클래스를 사용해야 한다. 원래 django.contrib.admin은 apps.AdminConfig 메소드를 기본값으로 사용했었다.

 

즉 django.contrib.admin은 아무 옵션도 추가하지 않을 경우 기본값으로 django.contrib.admin.apps.AdminConfig 클래스를 사용해 왔던 것이다. 

그러나 autodiscover() 메소드를 사용하고 싶지 않다면 settings.py의 INSTALLED_APPS에 django.contrib.admin 을 지우고 django.contrib.admin.apps.SimpleAdminConfig를 추가하면 된다. 

 

 

ModelAdmin 인터페이스의 옵션들

ModelAdmin은 규모가 큰 인터페이스이고, 그만큼 커스터마이징을 위한 여러 옵션을 추가할 수 있다. 

옵션은 각 어드민 클래스의 필드 형식으로 지정하면 된다. 

 

1. actions

actions의 값으로는 함수들의 리스트를 입력한다. 

해당 어드민 클래스에서 사용할 수 있는 함수, 기능들을 나열할 수 있다. 

 

2. actions_on_top / actions_on_bottom

True나 False를 입력한다. 

actions 옵션으로 입력한 기능들을 페이지의 위에 표시할지, 아래에 표시할지를 지정한다. 

class ProjectAdmin(admin.ModelAdmin):
	actions_on_top = True

 

3. date_hierarchy

모델의 필드 중 DateField 또는 DateTimeField 타입인 필드 이름을 값으로 갖는다. 

해당 모델의 데이터를 정렬할 때 입력한 필드의 날짜 순서대로 정렬해 준다. 

역순으로 정렬하고 싶다면 필드 이름 앞에 - 을 붙이면 된다. 

class ProjectAdmin(admin.ModelAdmin):
	date_hierarchy = '-register_date'

 

4. empty_value_display

문자열을 값으로 받는다. 

두 가지 방법으로 사용할 수 있다. 

 

첫째로, 각 어드민 클래스의 필드 이름으로 empty_value_display를 사용해서 지정할 수 있다. 

해당 모델의 필드 중 빈 값(null 또는 "" 공백 문자열)이 있다면 그 값을 관리자 페이지에서 어떻게 표시할지를 지정한다. 

class UserAdmin(admin.ModelAdmin):
	empty_value_display = 'EMPTY'

 

둘째로, 데코레이터를 사용해서 각 필드값을 리턴하는 함수 위에 붙여서 사용할 수 있다. 

첫번째 방법에서는 해당 모델에 속한 모든 필드의 빈 값을 같게 나타내지만, 두 번째 방법을 사용하면 각 필드별로 빈 값을 다르게 표시할 수 있다. 

class UserAdmin(admin.ModelAdmin):
	list_display = {'id', 'view_username', 'view_userid'}

	@admin.display(empty_value="no name")
	def view_username(self, obj):
    	return obj.username
        
	@admin.display(empty_value="no id")
	def view_userid(self, obj):
		return obj.userid

 

5. exclude

필드 리스트를 값으로 받는다. 

제외하고 싶은 필드들이 있을 때, exclude의 값으로 입력한다. 

class UserAdmin(admin.ModelAdmin):
	exclude = ['birth-date', 'age']
	// birth-date, age 필드를 제외한 모든 필드가 관리자 페이지에 나타남

 

6. fields

필드 이름 튜플을 값으로 받는다. 

데이터를 수정(change)이나 추가(add)하는 페이지에서 fields의 값에 포함된 필드들만 나타나게 할 수 있다. 

serializer.py에서 read-only로 지정된 필드들만 fields 리스트에 포함될 수 있다. 

더 세부적인 작업을 하고 싶으면 fieldsets 옵션을 사용하자. 

# models.py
class Homework(models.Model):
	title = models.CharField('제목')
	content = models.TextField()
	teacher = models.ChoiceField(choices=TEACHER_LIST)
	submission_date = models.DateTimeField()

# admin.py
class HomeworkAdmin(admin.ModelAdmin):
	fields = ('title', 'content')

 

위 예시의 경우, 데이터를 추가 및 수정하는 페이지에서는 title과 content 필드에 대해서만 수정 및 추가 작업을 할 수 있다. 

또한, fields 튜플 안에서 괄호()를 한번 더 사용하면, fields 튜플 안의 필드들을 한 줄로 나타낼 수 있다. 

 

7. fieldsets

fields와 기본적인 역할은 같고, 튜플을 원소로 갖는 튜플 리스트(two-tuple)를 값으로 받는다. 처음 관리자 페이지에서 보는 카테고리 화면이 아니라, 데이터를 추가나 수정하는 페이지에서 선택한 필드를 그룹으로 묶어서 나타내는 데 사용한다. 

fields 옵션에서는 필드 그룹이 하나만 있었다면, fieldsets 옵션에서는 하나의 모델에 대해서도 여러 필드 그룹을 만들 수 있다. 

여러 개의 그룹을 만들고 싶다면 fieldsets 안에서 튜플을 여러 개 만들면 된다. 각 튜플은 "옵션"과 {} 딕셔너리로 이루어진다. 

 

이런 식으로 만들면 된다. 

 

fieldsets = (

    ("그룹_1의 이름", {

        "fields": ('그룹_1에 들어갈 필드_1', '그룹_1에 들어갈 필드_2')

    }),

    ("그룹_2의 이름", {

        "fields": ('그룹_2에 들어갈 필드_1', '그룹_2에 들어갈 필드_2'), 

    })

)

# models.py
class Course(models.Model):
	student_name = models.CharField()
	lecturer_1 = models.ChoiceField(choices=LECTURER_LIST)
	course_1 = models.ChoiceField(choices=LECTURER_LIST)
	lecturer_2 = models.ChoiceField(choices=LECTURER_LIST)
	course_2 = models.ChoiceField(choices=LECTURER_LIST)
	lecturer_3 = models.ChoiceField(choices=LECTURER_LIST)
	course_3 = models.ChoiceField(choices=LECTURER_LIST)
    
# admin.py
class CourseAdmin(admin.ModelAdmin):
	fieldsets = (
		("강의 1", {"fields": (('lecturer_1', 'course_1'))}),
		// 그룹 이름을 '강의 1'로 설정
		// 강의 1에 해당하는 필드들을 개별 그룹으로 표시
		// 필드들을 한 줄에 표시
        
		("강의 2", {"fields": ('lecturer_2', 'course_2')})
		// 그룹 이름을 '강의 2'로 설정
		// 강의 2에 해당하는 필드들을 개별 그룹으로 표시
		// 각 필드는 한 줄을 차지함
    )

 

또한 fieldsets 내부의 딕셔너리의 값으로 "fields" 뿐만 아니라 다른 값을 추가로 사용할 수도 있다. 

대표적으로는 classes, description 등이 있다. 

 

1) classes

해당 fieldset에 CSS 속성을 적용할 때 사용한다. 

class CourseAdmin(admin.ModelAdmin):
	fieldsets = (
		(None, {
        "fields": (('lecturer_1', 'course_1')),
        "classes": ('wide', 'extrapretty')
        }),
    )

 

2) description

각 fieldset 위에 추가 텍스트를 넣을 때 사용한다. 

 

또한 fields나 fieldsets 옵션을 따로 명시하지 않았다면, 장고에서는 기본값으로 AutoField가 아니고 editable=True로 된 필드들만 관리자 페이지에 포함시킨다. 

 

 

fieldsets, list_display의 차이점

헷갈리는 부분이라 적어보았다. 

fields와 fieldsets는 처음 관리자 페이지에서 모델명을 누르면 나오는 조회 페이지가 아니라, 조회 페이지에서 개별 데이터를 누르면 나오는 추가 및 수정 페이지에서 어떤 필드를 표시할지를 결정한다. 

반면 list_display는 관리자 페이지 시작 화면에서 모델명을 누르면 나오는 조회 페이지에서 어떤 필드를 표시할지를 결정한다. 

 

8. filter_horizontal & filter_vertical

필드 이름 튜플을 값으로 받으며, ManyToManyField(다대다 필드) 에서만 작동한다. 

fieldsets과 마찬가지로 조회 페이지가 아니라 추가 및 수정 페이지에서 작동한다. 

many-to-many field 특성상 선택하는 가짓수가 많을 때는 다루기 어려울 수 있기 때문에, 간단한 인터페이스를 사용해서 데이터를 쉽게 추가 및 수정할 수 있게 했다. 

 

filter_horizontal의 경우 선택되지 않은 가짓수(옵션)이 왼쪽, 선택된 옵션이 오른쪽 박스에 나타난다. 

filter_vertical의 경우 선택되지 않은 옵션이 위쪽, 선택된 옵션이 아래쪽 박스에 나타난다. 

 

9. form

관리자 페이지에서 모델뿐만 아니라 폼 데이터를 추가 및 수정할 때 사용한다. 

# forms.py
class CarForm(forms.ModelForm):
	
    class Meta:
		model = Car
 		exclude = ['engine oil']
        
# admin.py
class CarAdmin(admin.ModelAdmin):
	form = CarForm

 

위의 경우, admin-form-model이 연결되어 데이터를 수정 및 변경할 수 있다. 

 

 

참고한 포스트

Admin actions | Django documentation | Django (djangoproject.com)

The Django admin site | Django documentation | Django (djangoproject.com)

장고 마스터하기 - 5장 - 김땡땡's blog (yonghyunlee.gitlab.io)

 

대부분의 웹 서비스에는 관리자 페이지가 있다. 관리자 페이지에서는 가입한 회원과 관련된 데이터들을 조회할 수 있다. 이를 통해 회사는 서비스가 어떻게 운영되고 있는지도 판단할 수 있기 때문에, 대부분의 웹 서비스에는 관리자 페이지가 있다. 

장고(django)에서도 관리자 페이지 기능을 제공한다. 

 

python manage.py runserver 명령어로 서버를 띄우면 기본 주소인 http://127.0.0.1:8000(포트번호) url로 로컬 서버에 접속할 수 있다. 

 

관리자 페이지를 보려면 http://127.0.0.1:8000/admin url로 접속하면 된다. 

그러면 관리자 페이지를 보기 위해서 관리자 아이디와 비밀번호를 입력하라는 창이 뜬다. 

 

관리자 계정 생성하는 방법

관리자는 보통 다른 사용자(유저)들의 정보를 열람, 수정 및 삭제할 수 있는 권한을 가진다. 따라서 장고에서도 관리자를 user이 아니라 superuser 이라고 부른다. 

 

관리자 계정으로 로그인하려면 우선 관리자 계정을 생성해야 한다. 

python manage.py createsuperuser

 

그러면 이메일, 이메일 주소, Password, Password(again) 을 입력하라는 메시지가 뜬다. 이에 맞게 입력해 주면 된다. 

나중에 관리자 계정으로 로그인할 때는 이메일과 Password를 입력해야 하니 이 두 정보는 꼭 기억하자!

 

Superuser created successfully.

이 메시지가 뜨면 성공적으로 관리자 계정이 만들어진 것이다. 

 

그럼 이제 로그인을 해 보자. 

python manage.py runserver

 

http://127.0.0.1:8000/admin url을 입력하면 로그인 화면이 나온다. 

이메일 에는 앞서 입력한 이메일 정보를, 비밀번호에는 앞서 입력한 Password 정보를 입력하면 로그인이 된다. 

 

그러면 관리자 페이지가 뜨고, 지금까지 프로젝트 내에서 정의한 모델이 있다면 각 모델에 데이터를 추가하거나 변경할 수 있다. 

 

관리자 계정 삭제하는 방법

만약에 관리자 계정의 정보를 잘못 입력하거나 새로운 관리자를 만들고 싶다면 기존 계정을 삭제하면 된다. 

관리자 계정도 결국은 하나의 사용자이기 때문에, 프로그램 내부에서 사용자를 조회하고 superuser인 유저를 삭제하는 방식으로 관리자 계정을 삭제하면 된다. 

 

우선 Shell에 접속한다. 

python manage.py shell

 

Python Shell 에서는 파이썬 문법의 코드를 사용해서 프로젝트의 DB에 저장된 데이터를 조회, 삭제 및 변경할 수 있다. 장고 ORM이 제공하는 기능 중 하나이다. 

파이썬 쉘(shell)이 아니었다면 직접 DB에 들어가서 SQL문으로 데이터를 조회해야 한다. 

 

여기서 확인해야 할 것이 있다. 

보통 관리자 계정은 django.contrib.auth.models.User 의 인스턴스로 저장된다. 

그러나 settings.py 파일의 AUTH_MODELS 필드가 위 클래스가 아닌 다른 클래스로 되어 있다면 관리자 계정이 AUTH_MODELS에 해당하는 클래스의 인스턴스로 저장된다. 

그러므로 settings.py의 AUTH_MODELS 필드가 어떤 클래스로 지정되어 있는지 먼저 확인하자. 

 

내 프로젝트의 경우는 사용자가 직접 만든 account.User 모델로 되어 있었다. 

이 경우, django.contrib.auth.models.User 모델을 import 해서 관리자 계정을 조회하면 다음과 같은 오류가 발생한다. 

즉 관리자를 조회하는 데 사용한 클래스와 AUTH_MODELS 의 클래스가 다를 때 이런 오류가 발생하는 것이다. 

 

User.objects.get(username="", is_superuser=True)

 

AUTH_MODELS 에 입력된 클래스를 import 하고 관리자 계정을 조회해 보자. 

이때 다른 기존의 유저들이 등록되어 있는 상황이라면, 헷갈리지 않기 위해서 is_superuser=True 를 옵션으로 추가한다. 

만약 관리자 계정이 나온다면, 이 계정을 제거해 주면 된다. 

User.objects.get(username="", is_superuser=True).delete()

 

그리고 위의 과정을 통해 다시 관리자 계정을 생성하면 된다. 

 

🗒️ORM이란?

object-relational-mapping 의 약자로, 객체(object)와 관계지향 데이터베이스(relational database)를 연결(mapping)하는 방법이다. 대부분의 프로그래밍 언어(python, java 등)에서는 객체 개념이 있고, 사용자 등 여러 모델을 만들 때 객체를 사용한다. 

하지만 그 모델을 저장할 때는 DB(데이터베이스)에 저장하게 된다. 

ORM은 프로그래밍 언어의 객체 개념을 관계지향 데이터베이스와 연결해 준다. 

 

예를 들어 파이썬으로 프로젝트를 개발하는데 ORM이 없다고 가정해 보자.

그러면 프로젝트에서 유저 등 객체를 생성할 때 DB에 쿼리(query)를 날려야 하고, 파이썬 프로젝트 코드 내부에 직접 유저를 생성하는 SQL 코드를 입력해 줘야 한다. 

그러나 ORM이 있다면 User.objects.create() 등의 간단한 파이썬 문법의 코드로 프로젝트 DB에 유저를 생성할 수 있다. 

 

 

지금까지 장고에서 기본으로 제공하는 관리자 페이지를 보기 위해서 관리자 계정을 생성하고, 조회하는 방법까지 알아보았다. 

그러나 장고는 관리자 페이지에 대해서 더 다양한 기능을 많이 제공하고, 관리자 페이지를 원하는 대로 직접 커스터마이징 할 수도 있다고 한다..! 

다음 번에는 장고의 관리자페이지 커스터마이징 방법에 대해서 작성해 보겠다. 

 

 

참고한 포스트

Writing your first Django app, part 2 | Django documentation | Django (djangoproject.com)

장고(django)에서 superuser를 삭제하는 방법. : 네이버 블로그 (naver.com)

 

개발을 하다보면 기존에 다른 사람들이 작업한 프로젝트를 이어받아서 작업해야 하는 경우도 생긴다. 

이때 라이브러리 버전 관리, 환경변수 설정 등이 알맞게 되어야만 이전 사람들이 프로젝트를 진행하던 똑같은 환경에서 개발을 진행할 수 있다.

오늘은 간단하게 그 순서에 대해서 알아보겠다. 

 

📒가상 환경

가상환경 만들기

우선 가상환경을 하나 만들어준다. 

 

가상환경을 만들기 위해서는 virtualenv라는 라이브러리가 필요하다. 없다면 아래 커맨드를 이용해서 virtualenv 라이브러리를 설치하자. 

이때 커맨드를 실행하는 위치는 프로젝트 root 디렉토리로 되어 있어야 한다. 

pip install virtualenv

 

 

이제 가상환경을 만들어준다. 지금 만든 가상환경 안에서 프로젝트에 쓰일 라이브러리와 버전을 관리할 것이다. 

virtualenv 뒤에는 가상환경의 이름을 붙여주면 된다. 보통은 venv를 많이 사용한다. 

virtualenv venv		// 가상환경 이름: venv
virtualenv myenv	// 가상환경 이름: myenv

 

때때로 python 버전에 따라서 사용 가능한 라이브러리가 달라지기도 한다. 

이 경우엔 가상환경을 만들 때 어떤 버전을 사용해서 가상환경을 운영할지도 따로 정할 수 있다. 

virtualenv venv --python=3.8	// python 3.8을 사용하는 가상환경 설치

 

가상환경을 만드는 이유

가상환경(virtual environment)을 사용하는 이유는 여러 가지가 있을 수 있다. 대표적인 이유는 여러 개의 프로젝트를 동시에 진행할 때 라이브러리 버전 관리가 쉽기 때문이다. 

 

예를 들어 프로젝트 A는 django-rest-framework 0.0.1 버전을 사용하고 프로젝트 B는 0.0.2 버전을 사용할 경우, 버전이 다르기 때문에 프로젝트를 바꿔 가면서 작업할 경우 버전에 혼동이 생긴다. 심한 경우는 버전이 맞지 않아서 실행되지 않을 수 있다. 

 

그러나 프로젝트별로 개별의 가상 환경을 만들고 그 안에서 작업하면, 가상환경마다 사용하는 라이브러리와 버전이 다르고, 프로젝트별로 어떤 버전을 사용하건 다른 프로젝트에 영향을 주지 않는다. 

 

가상환경 실행하기

위에서는 가상환경을 만들었다. 앞으로 프로젝트를 작업할 때마다 이 가상환경을 실행한 상태에서 작업해야 한다. 

(가상환경에 프로젝트에 필요한 라이브러리가 모두 포함되기 때문에, 가상환경을 실행하지 않으면 어차피 프로젝트를 실행할 수 없다.)

 

윈도우에서 가상환경을 실행하는 방법은 Command Prompt에서 실행하는 방법과 PowerShell에서 실행하는 방법 두 가지가 있다. 

 

Command Prompt(cmd 창)에서 실행하는 방법은, 가상환경 이름\Scripts\activate.bat

venv\Scripts\activate.bat

 

PowerShell에서 실행하는 방법은, .\가상환경 이름\Scripts\Activate.ps1 

.\venv\Scripts\Activate.ps1

나는 항상 cmd로 작업해서 위의 방법을 사용했다. 그러나 powershell이 mac과 linux에서 사용하는 커맨드를 사용한다고 들어서, 앞으로는 powershell 명령어도 많이 익힐 필요가 있겠다. 

아무튼 이 과정을 마치면 터미널 창에서 뜨던 디렉토리 앞에 (venv) 가 붙는다. 이는 가상환경이 현재 실행 중이라는 뜻이다. 이제 작업하면 된다!

 

라이브러리 설치

본인이 처음부터 끝까지 프로젝트를 만드는 경우라면 가상환경 작업을 끝내고 바로 프로젝트를 만들어도 되지만, 다른 사람들과 같이 개발하는 경우는 추가 작업이 필요하다. 

 

현재 프로젝트 가상환경에서 사용한 라이브러리를 파일로 저장하기

여러 명이 프로젝트 하나를 개발하는 경우, 사람들이 작업하던 환경과 같은 환경에서 프로젝트를 개발해야 한다. 이때 라이브러리의 버전 관리 등을 쉽게 하기 위해서는 사용한 라이브러리의 버전을 모아서 관리할 필요가 있다. 

 

이럴 때 pip의 freeze 기능을 사용한다. 

pip freeze > requirements.txt

freeze를 하면 현재 프로젝트에서 사용된 라이브러리와 버전을 requirements.txt 파일을 만들어서 그 안에다 저장해 준다. 

이러면 나중에 다른 사람이 이 프로젝트를 작업하게 되었을 때, requirements.txt 파일을 사용하여 똑같은 라이브러리와 버전을 가상환경에 설치하여 사용할 수 있다. 

 

프로젝트에서 사용한 라이브러리를 설치하기

이 경우는 위의 경우와는 반대로, 다른 사람이 작업했던 프로젝트를 이어받아 작업할 때 사용한다. 

앞서 작성된 requirements.txt 파일에 설치된 라이브러리와 버전을 하나하나 다운받지 않고, 다음 명령어를 사용한다. 

(파일명을 다르게 하고 싶으면 뒤의 부분을 바꾸면 된다.)

pip install -r requirements.txt

requirements.txt 파일에 입력된 라이브러리와 버전을 현재 가상환경에 설치해 준다. 

 

⚠️설정 파일(requirements.txt)은 딱 하나만 두고 관리하자. 

여러 사람이 작업하다 보면 여러 개의 설정 파일이 생길 수 있다. 그러면 때론 파일을 혼동하여, 가장 최근의 라이브러리 설치 상태를 반영한 파일이 아닌 다른 파일에 작성된 라이브러리를 설치하게 될 수 있다. (내가 했던 실수...)

따라서 설정 파일(requirements.txt)은 꼭 하나만 두고 관리하자. 

 

위의 두 과정에서 별다른 오류가 없었다면, 프로젝트 실행을 위한 기본적인 작업은 끝났다. 이제는 환경변수 작업만 남았다. 

 

📒환경변수(.env)

프로젝트를 실행하기 위해서 필요한 중요한 정보를 담고 있는 변수. 

보통 데이터베이스의 포트 번호, 비밀번호 등을 포함하기 때문에 절대 외부에 공유해서는 안 된다. (비밀번호 다 털림. 계정 털림.)

 

환경변수 파일 이름은 보통 .env 로 사용한다. 

 

gitignore 사용해서 환경변수 파일이 github/git에 공유되지 않게 하기

이 파일을 공유하지 않으려면 gitignore를 활용해야 한다. 

.gitignore 파일을 만들고, 이 안에다가 깃허브에 공유하고 싶지 않은 파일 이름 또는 확장자를 적어주면 된다. 

 

예를 들어서, .gitignore 파일에 다음과 같이 입력해 보자.

.env
.venv
info.py

그리고 프로젝트를 깃허브에 등록할 때, 확장자가 env 또는 venv인 파일과 info.py 파일은 깃허브에 등록되지 않는다. 

 

⚠️예외 경우

다만 예외인 경우도 있다. 이미 git에 등록되어 관리되던 파일이라면, 관리된 이후에 .gitignore 파일에 추가된다고 해서 업로드에서 제외되지 않는다. 

 

이 경우 추가적인 git 명령어를 사용해서 작업해야 한다. 

 

작업 과정

1. .gitignore 파일에 깃허브에 올리지 않을 파일명 추가

2. git 캐시 삭제

--cached 옵션을 추가하지 않으면 로컬 저장소에 있는 파일과 원격 저장소(깃허브)에 있는 파일이 모두 삭제된다. 

지금은 원격 저장소인 깃허브에 등록된 파일만 삭제하려는 것이므로 꼭 --cached 옵션을 붙여주자. 

git rm -r --cached .

3. git에 현재 작업한 내용을 임시로 저장

: add 뒤에는 현재 디렉토리를 명시하기 위해서 . 하나를 붙인다. 

git add .

4. 현재 git 프로젝트의 상태 확인

: 현재 등록된 커밋(commit)이 있는지를 보여준다. 

git status

5. 변경사항 저장하기

git commit

 

.env 파일 간단하게 생성하는 방법

gitignore.io - 자신의 프로젝트에 꼭 맞는 .gitignore 파일을 만드세요 (toptal.com)

이 링크에서 본인의 운영체제와 사용하는 언어/프레임워크를 검색어로 입력하면 그에 맞는 .env 파일 형식을 생성해 준다. 

이를 참고하여 제외할 부분은 제외하고, 추가할 부분은 추가로 작성하는 방식으로 .env 파일을 작성할 수 있다. 

 

📒Git(깃)

Git은 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템다.

 

로컬 저장소와 원격 저장소

여러 명의 사용자는 각자의 로컬 PC에서 작업을 진행하고, 이를 원격 저장소에 공유하는 방식으로 작업한다. 

 각자의 PC=로컬 저장소, Github 계정=원격 저장소 이다. 

 

파일 업로드 과정

개인 PC에서 작업한 이후에는 작업내용을 공동 저장소인 깃허브에도 저장해야 한다. 

이 과정을 보통 '커밋을 한다'고 하지만, 구체적으로는 네 가지 상태로 나눠진다. 

 

0) Working Directory

작업하면서 생긴 변경사항들이 아무 영역에도 반영되지 않은 상태이다. 

 

1) Staging

작업하면서 생긴 변경사항이 '임시저장' 된 단계이다. Github Desktop 등의 프로그램을 사용하면 변경사항이 생기자마자 바로 staging 영역으로 등록된다. 

그렇지 않은 경우, git add . 명령어를 사용해서 현재 디렉토리에서 발생한 변경사항을 임시저장인 staging 영역으로 등록해 준다. 

 

2) Commit

Staging 영역으로 등록된 변경사항들이 기록으로 남는 영역이다. 아직 깃허브에 변경사항이 저장된 상태는 아니다. git commit 명령어를 통해 실행할 수 있다. 

다만 Staging 단계와의 차이점은 Commit부터는 깃허브에서 작업 기록으로 남는다는 것이다. Staging 단계에서는 add를 남발해도 임시저장의 개념이라 아무런 기록이 남지 않지만, commit을 남발하면 그 변경사항이 모두 기록된다. 

따라서 보통의 공동작업에서는 커밋을 남발하지 않고, 기능 추가/기능 개선/오류 처리 등 여러 기준을 세우고 그에 따라서 커밋을 하는 것이 일반적이다. 

 

3) Push

commit 된 사항에 대해서 push를 하도록 권장한다. push 된 내용은 깃허브에 반영될 수 있다. 

git push 명령어를 통해 실행할 수 있다.

다만 프로젝트에 따라서 개인이 push하면 바로 깃허브에 반영이 되도록 할 수도 있고, 여러 사용자가 확인 뒤 승인(?)하면 변경사항이 반영되도록 할 수도 있다. 

 

 

참고한 포스트

[Git] gitignore란 무엇일까? :: Gyun's 개발일지 (tistory.com)

git rm --cached 파일 삭제 :: 마이구미 :: 마이구미의 HelloWorld (tistory.com)

[GIT] area, add, commit, push, stage (velog.io)

 

 

+ Recent posts