전체 글

주로 백엔드, 클라우드 인프라 주제를 다룹니다
사실 학교를 다니면서, 학기 회고록을 작성하는것은 이번이 처음인것 같다. 학생신분에서 부끄러운 이야기지만 나는 그렇게 공부를 열심히도, 잘하는 학생도, 동시에 신경도 쓰지 않는 학생이다.(당연히 학점도 처참하다) 단지 정말 프로그래밍에 관심이 많았고, 어렸을때부터 꿈이었기에 현재 학과를 왔고, 대학교를 와서 코딩을 시작하였다. 이런 사람이 학기 회고록을 쓴다니 의아해 하는 사람들이 많을것이다. 이번학기회고록을 작성하는 이유는, 나에게 매우 뜻깊었고, 그 어느 학기보다 가장 힘들면서 열정적으로 살았으며, 나의 다음 출발을 위한 쉼표를 찍는 학기이기 때문이다. 사실 모든 내용을 다루진 않을것이며, 간단한 나의 이야기, 이번학기 중점이 되었던 팀플들과 그와 관련된 과목들의 스토리로 이야기를 조금 해볼까 한다...
· Discord Bot
https://github.com/J-hoplin1/Weather_Hook GitHub - J-hoplin1/Weather_Hook: Weather Web Hook for Discord & Slack Weather Web Hook for Discord & Slack. Contribute to J-hoplin1/Weather_Hook development by creating an account on GitHub. github.com 날씨 관련 API 정하기 다양한 사이트의 API를 살펴보고 사용해보았습니다. 하지만 대부분 사용하기 편하지 않다거나(API Document가 제대로 작성되어있지 않음), 유료인 경우가 많았습니다. API같은 경우에는 결론적으로 https://openweathermap.org/..
SOLID 원칙이란? SOLID 법칙이란, 객체지향 프로그래밍 및 설계의 다섯가지 기본 원칙이다. 시간이 지나도 유지 보수 및 확장이 쉬운 시스템을 만들고자 할때 이 원칙들을 함께 적용할 수 있다. SOLID 원칙에는 총 5가지의 원칙이 있으며, 하나씩 알아보자 1. 단일책임의 원칙(SRP, Single Responsibility Principle) 단일 책임 원칙이란, 하나의 클래스(혹은 객체)는 단 하나의 책임만을 가진다 라는것을 가진 원칙이다. '책임'이 많다라는것은, 곧 변경될 여지가 많다는 것과 동일한 의미이다. 또한 책임을 많이 가질수록, 클래스 내부에서 서로 다른 역할을 수행하는 코드끼리 강하게 결합될 가능성이 높다. 두가지 이상의 기능이 필요한 경우에는, 클래스를 나눠야한다. SRP와 관련..
일반적인 Arrys.sort()를 사용하면, 컴퓨터는 배열에 대해 정렬을 수행한다. 이는 컴퓨터의 내부적인 정렬이 아닌 각 자료형의 래퍼 클래스(Integer, String... etc)들이 Comparable 인터페이스를 구현함으로서 정렬이 가능한 것이다. 정렬 기준을 만드는데 있는 인터페이스에는 Comparable뿐만아니라 Comparator도 있다. 두 인터페이스 모두 객체를 비교한다는 같은 기능을 목적으로 고안된 것이다. 이 두 인터페이스는 Java Collection Framework에 소속되어있다. Comparator Document : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Comparator.html C..
· Android
다크모드가 활성화되어있는 상태에서 앱을 실행하면, 색이 반전되어, 테마 색이 망가지는 경우가 있다. 이런 경우 아래 코드를 최초 실행 액티비티의 onCreate()메소드에 아래 코드를 입력해주면 된다.(한번만 입력해줘도됨) AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
· Android
일반적으로 앱들은 하나의 앱으로 되어있지 않고, 여러 페이지로 되어있다. 즉 여러가지 액티비티를 두고, 액티비티를 전환하는 것이다. 액티비티를 추가 하기 위해서 안드로이드 프로젝트 "app" 우클릭 - New - Activity - Empty Activity를 선택하여 새로운 액티비티를 추가해 준다. 액티비티를 이렇게 추가해 주면, AndroidManifest에 새로 추가한 액티비티의 정보가 들어가 있을것이다. 여기서 각자 만들고자 하는 예제에 따라 추가적인 속성을 부여해 준다. 필자같은 경우 , Dialog 테마의 액티비티를 생성해 주었고, 액티비티의 제목에 해당하는 label속성은 Menu Activity로 지정하였다. 태그는 기본적으로, 생성된 액티비티에 대한 정보를 가지고 잇으며, 새로운 액티비티..
· Android
예를 들어서 메인 레이아웃 안에 부분 화면을 띄워본다고 가정하자. 기본적으로 메인 레이아웃은 setContentView()메소드를 사용해서, 인플레이션 과정을 거친다. 그렇다면 부분화면은 어떻게 띄워야할까? 처음에 setContentView()로 부분화면을 객체화할 수 있지 않을까? 생각해 봤지만, 부분화면을 인플레이션하지 못한다고 한다. 이 이유는 setContentView()메소드는 Activity에 보일 View를 지정할 때 사용하는 메소드이기 때문이라고 한다. 부분화면이 메인 액티비티에 띄워지는 과정은 아래 과정과 같다(소스코드 관점) 부분화면 레이아웃 인플레이션 부분화면 레이아웃이 담길 ViewGroup지정 ViewGroup을 메인 레이아웃에 띄운다. 우선 activity_menu.xml, su..
· Android
안드로이드 개발을 할때 코드(Java, Kotlin)파일과 XML Layout파일을 분리시키는것을 알 수 있다. 그리고 소스코드에 setContentView메소드를 이용해 해당 코드와 같이 사용할 전체 레이아웃을 지정하곤 한다. setContentView에 지정할때 R.layout.(확장자 없이 레이아웃 파일 이름만) 과 같이 지정하는데, 여기서 R 클래스는 프로젝트 창의 "res"폴더를 의미하는 클래스이며 각 리소스에 id가 배정되는 클래스이다. 즉, R.layout 이라고 하면 res/layout이라는 의미이다. 다른 예시로 R.id라고 하면, 이 프로젝트 내에 생성된 리소스들 중 특정 id를 지정하는 것을 의미한다. https://developer.android.com/reference/androi..
· Android
Progress Bar은 진행 정도를 표시하거나, 작업이 진행중임을 사용자에게 알려야한다. 안드로이드에는 크게 두가지 모형의 Progress Bar이 존재한다 막대모양 : 작업의 진행 정도를 알려줄 수 있도록 막대 모양으로 표시 원 모양 : 작업이 진행중임을 알려준다. 원모양으로된 프로그레스바가 반복적으로 표시된다. Progress Bar의 XML 태그는 이며,프로그래스 바가 갖는 최대 범위는 max속성으로, 현재 값은 progress속성으로 나타내준다. 현재값인 progress속성은 메소드인 setProgress(int progress)를 통해서 설정해 줄 수 있다. 예제 소스코드를 보자. package com.example.sampleprogress; import androidx.appcompat.a..
· Android
Android에서 간단한 메세지를 보여줄때 Toast도 사용하지만, Snackbar를 사용하는 경우도 있다. Snackbar는 Toast와 달리 화면 하단에 메세지를 띄워서 간단한 피드백을 제공하는 UI이다. 아래와 같이 버튼을 누르면 Snackbar의 간단한 예제를 작성해 보자. package com.example.snackbar; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import com.google.android.material...
· Android
AlertDialog 응용예제가 갑자기 생각났다. 간혹 몇몇 애플리케이션에서 root 액티비티에서 뒤로가기 키를 누르면, "앱을 종료하시겠습니까?" 라는 Dialog창을 띄우는것을 볼 수 있다. 한번 그 코드를 구현해 보려고 한다. 우선 코드는 아래와 같이 작성하였다.(딱히 설정할 레이아웃은 없다) package com.example.sampletoast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.DialogInterface; import android.os.Bundle; import android.view.KeyEvent; import an..
· Android
안드로이드 환경을 사용하다 보면 아래와 같이 알림상자를 간혹 볼 수 있다. 이러한 것을 알림 대화상자, AlertDialog라고 부르며, 이는 사용자에게 확인을 받거나 선택하게 할때 사용한다. Edit Text와 같이 사용자와의 상호작용을 위한것이 아닌 일방적인 메세지 전달의 역할이다. 아래 예시와 같이 레이아웃과 MainActivity.java 파일을 작성하자 activity_main.xml MainActivity.java package com.example.sampletoast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import android.content.DialogInte..
· Android
안드로이드는 세로 방향도 있지만, 가로 방향도 있다. 단말 방향이 바뀌게 되면 화면 비율이 변경되므로 화면이 다시 보이게 된다. 즉 다른 레이아웃을 보게 된다는 것이다. 이로 인해 단말 방향이 바뀌게 되면, 액티비티는 메모리에서 없어졌다가 다시 만들어진다. 우리가 기본적으로 res/layout의 폴더에는 세로 방향 액티비티 xml이 저장된다. 가로 방향 xml을 만들기 위해서는 res/layout-land라는 폴더를 만들어야 한다. 이 layout-land폴더 안에있는 xml파일이 단말이 가로방향으로 되었을때 우선적으로 적용되는 것이다. 정말 단말 방향이 바뀔때마다 액티비티를 메모리에서 없앴다가 다시 만들까? 우선 res 아래 layout_land라는 디렉토리를 만들고, layout폴더 안에있는 acti..
Django의 Model & ORM Django 는 MVT(Model View Template, MVC와 동일한 의미)패턴을 사용하는 프레임워크이다. Django에서는 Model의 디폴트 DB를 sqlite3로 사용하고 있으며, 이 외 RDBMS와 연동하여 사용할 수 있도록 ORM(Object Relation Mapping, 객체-관계 매핑)을 제공한다. 그리고 우리는 Django Application내에 models.py에 ORM 클래스를 작성하여 DB를 생성하여 준다. 그 후 makemigrations 와 migrate를 이용해서 DB를 초기화해준다. 간단히 이 두 명령어의 차이점을 짚고 넘어가면, makemigrations는 models.py에서 변경한 내용을 기반으로 migration파일을 만드는..
static파일 처리하는 과정 static 파일이 포함된 프로젝트에서 서버로 배포하기 위해서는 아래 두가지 과정을 거쳐야 한다. static 파일의 위치를 설정해주기 static파일을 한곳에 모으기 이 과정들을 하기 위해서는 아래와 같은 처리들을 해주어야한다. 앱 내에 static 폴더를 만들어서 위치를 지정해 준다. settings.py에 static폴더 위치를 기재해 주어야한다. python3 manage.py collectstatic 명령어를 통해서 static파일을 모아준다. Django는 Web Application 프레임 워크이다. Web Application은 요청에 맞춰 데이터를 처리한 후 Response를 하는 역할을 한다. static 리소스라는것은, 말 그대로 '정적' 인 컨텐츠이다...
Django를 실제 서비스 상태로 놓을때 settings.py의 DEBUG 변수 값을 False로 바꿔주어야 한다. Django의 runserver는 개발단계에서 단지 일시적으로 웹서버 기능을 하기 위한 것이다. runserver를 실서비스에서 사용하지 않는 이유 Django의 runserver는 보안, 성능의 한계가 있어서 실서비스에는 부적절하다. 그래서 일반적으로 WAS + WSGI 조합을 주로 사용한다. 가장 흔한 조합은 NginX + Gunicorn조합을 많이 사용한다. NginX + Gunicorn + Django에 대한 포스트는 다음에 다루어 보도록 하겠다. DEBUG=False 상태에서 static파일 접근하기 DEBUG=False상태에서 static 파일에 접근하기 위해서는 runserve..
터미널을 이용해서 로컬이 아닌 외부 서버의 mysql / maria db에 접속하는 방법을 알아보자. 아래와 같은 명령어를 사용해 주면 된다 >> mysql -h {host} -u {username} -P {port number} -p {password} 각 필드의 의미를 간단하게 살펴보자 -h : 호스트 정보를 입력한다. ip 형식이 될 수 있고, DNS가 설정되어있는 경우, DNS를 명시해 주어도 된다. -u : mysql username 이다 -P : port번호를 적어준다. mysql의 디폴트는 3306이다. 하지만 따로 설정을 했었다면 해당 포트번호를 명시하자 -p : 패스워드를 입력한다. 패스워드를 커맨드에 같이 입력해도 되지만, -p만 명시해준 경우, mysql 콘솔에서 입력할 수 있다.
python으로 MySQL에 접속해 데이터 CRUD를 하고 싶다라는 상황을 가정하자. 이 경우 기본적으로 "Python을 이용해 MySQL에 접속" 이 이루어 져야 한다. 물론 Django같은 경우 ORM을 사용해서 간단하게 접근하는 등의 방법이 있지만, 여기서는 순수 Python의 MySQL접속과 기본적인 상호작용에 대해서만 초점을 두겠다 pymysql의 설치 명령어는 아래와 같다. pip3 install PyMySQL pymysql의 document는 아래 링크로 들어가면 된다 https://pypi.org/project/PyMySQL/ PyMySQL Pure Python MySQL Driver pypi.org MySQL에 연결하기 MySQL에 연결하기 위해서는 pymysql의 connect()라는..
· Android
안드로이드는 두가지의 이벤트가 존재한다. 터치 이벤트 : 손가락으로 화면을 터치시 발생 키 이벤트 : 실제 버튼이나 소프트 키패드를 누를시 발생 안드로이드에서는 터치 이벤트를 쉽게 처리할 수 있도록 '클릭 이벤트'를 별도로 제공한다. 예를 들면 XML을 이용해 버튼에 onClick attribute에 처리기 함수를 등록하는것처럼 말이다. 버튼의 onClick은 코드적으로 setOnClickListener() 를 통해서 등록할 수 있다. 이러한 처리 방식을 "위임 모델(Delegation Model)"이라고 부른다. 위임모델은, 화면에서 발생하는 이벤트를 위젯객체에 전달한 후 이 처리과정을 위젯에 위임하는 구조이기 때문에 이렇게 부른다. 그리고 이 위임모델은 각각 이벤트를 처리할 수 있는 리스너 인터페이스..
· Android
예시 SMS입력 레이아웃을 만들자. 화면 구성은 아래 3가지로 요약된다. 입력상자 현재 입력중인 글자 수를 Count해주는 TextView, 이것은 오른쪽에 정렬되어있다. 버튼 두개가 있는 레이아웃 : Send, Copy두가지가 있다. 이 버튼들은 가운데 정렬되어있다 Send : 입력한 문자를 Toast로 출력한다 Copy : 입력한 문자를 클립보드에 복사한다. 복사가 완료되면, Toast로 복사되었다고 알려준다 다른 추가적인 조건들은 아래와 같다. 최대 80바이트를 입력할 수 있다. addTextChangedListner 메소드를 사용하면, TextWatcher 객체를 설정하여 텍스트가 변경될 때 마다 발생하는 이벤트를 처리한다. TextWatcher는 아래 세가지 메소드 선언문이 정의되어있는 Inte..
· Android
텍스트를 클립보드에 복사하는 기능을 구현해 보자. 이 기능을 구현하기 위해서는 "ClipboarManager"라는 클래스를 사용해야한다. 다만 주의할 점은 "android.content.ClipboardManager"를 선언해 주어야 한다는 것이다. Android Document는 아래 링크에 있다. https://developer.android.com/guide/topics/text/copy-paste?hl=ko 복사하여 붙여넣기 | Android 개발자 | Android Developers 복사하여 붙여넣기 Android는 복사하여 붙여넣기를 지원하는 강력한 클립보드 기반 프레임워크를 제공합니다. 텍스트 문자열, 복잡한 데이터 구조, 텍스트 및 바이너리 스트림 데이터, 애플리케 developer.an..
· Android
테이블 레이아웃은 표나 엑셀 시트와 같이 '테이블'형태로 화면을 구성하는 레이아웃이다. 테이블은 기본적으로 열과 행으로 이루어져있는데, 테이블 레이아웃 또한 열과 행으로 레이아웃을 구성한다. Table Layout은 기본적으로 TableRow라는 태그가 여러개 들어가 한 행을 구성한다.TableRow안에는 뷰들이 들어가고, 이 뷷르은 각각 하나의 열이 된다.그리고 TableRow마다 추가된 뷰의 개수가 열의 개수가 된다. 우선 LinearLayout안에 TableLayout을 넣어준다. TableLayout은 Palette의 Layouts에 있다. 하나의 특징을 더 살펴보면, TableLayout안에 TableRow가 디폴트로 4개 생성되는것을 볼 수 있다. TableRow를 추가하면 기본적으로 layo..
· Android
레이아웃에 뷰를 추가하면, 기본적으로 뷰는 나머지 공간을 모두 채울수도, 위치를 지정할 수 도 있다. 하지만 여유공간을 모두 채우면, 뷰가 서로 달라붙거나, 텍스트가 꽉차보여 구성이 이상해질 수 도 있다. 뷰는 바깥공간과 안쪽 공간이 있고, 일반적으로 모든 공간을 포함한 부분을 셀 이라고 한다. 일반적으로 버튼, 텍스트뷰를 위젯이라고 부르기 때문에, 위젯 셀이라고도 한다. 뷰의 바깥쪽 공간을 Margin이라고 하고, lay_out_margin속성으로 간격을 지정할 수 있다. 테두리 안쪽을 Padding이라고 부르며, padding속성을 이용해서 설정할 수 있다. 아래와 같이 TextView세개를 만들고 Padding을 실험해 보자. 디폴트를 보면, layout_width가 wrap_content로 되어있..
· Android
리니어 레이아웃 안에 들어있는 뷰는 왼쪽 가운데, 오른쪽 등 방향을 지정해 정렬할 수 있다. CSS에서는 align이라는 속성으로 정렬을 하였지만 안드로이드에서는 'gravity'라는 속성으로 정렬을 한다. 레이아웃 정렬기능에는 아래 두가지가 있다. 정렬 속성 설명 layout_gravity 부모의 여유 공간에 뷰가 모두 채워지지 않아 여유공간이 생겼을 때 여유공간 안에서 뷰를 정렬한다 gravity 뷰 안에 표시하는 내용물(content)를 정렬한다. layout_gravity 우선적으로 layout_gravity속성은 layout_width, layout_height 속성을 wrap_content(컨텐츠를 감싸는것을 의미) 로 만든 후 에 사용할 수 있다. 그 이유는 match_parent를 사용하면..
· Android
XML을 이용해서 레이아웃 위에 뷰를 만들 수 있다. 반대로 소스코드를 통해서 레이아웃에 뷰를 추가할 수 도 있다. 우선 기본적으로 MainActivity.java를 살펴보자 package com.example.androidexcersice; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_m..
· Android
버튼 추가하기 간단하게 버튼을 추가해 보자. 버튼은 activity_main.xml 화면 좌측에 있는 Palette에 위치해있다. 드래그 해서 배치하고 싶은 곳에 배치를 한다. 버튼의 속성 변경은 오른쪽 Attribute에서 할 수 있으며, 버튼의 글은 text로 변경할 수 있고, 이벤트 등록은 onClick속성에 추가할 수 있다. 이벤트 처리 함수는 자바파일로 정의해준다. Toast를 사용해 메세지 띄우기 간단한 메세지를 띄워보자 Toast를 사용하면 화면에 잠시 보였다 없어지는 메세지를 구현할 수 있다. public void onButtonClick(View v){ // Toast.LENGTH_SHORT : 화면에 보여지는 시간이 2초이다 // Toast.LENGTH_LONG : 화면에 보여지는 시간..
람다식이란 람다식이란 간단히 말해 메소드를 하나의 '식'(expression) 으로 표현한 것이다.람다식은 함수를 간략하면서도 명확하게 표현할 수 있다는 장점이 있다. 메소드를 람다식으로 표현하면, 메소드 이름, 반환타입이 없어지므로 익명함수(Anonymous Function)이라고도 부른다.예를들어 아래와 같이 사용할 수 있다. int[] arr = new int[5]; Arrays.setAll(arr,(i) -> (int)(Math.random() * 5) + 1); 람다식 작성하기 람다식의 기본 형태는 아래와 같이 생겼다 (매개변수 선언) -> {문장들} 다만 여기서 반환값이 있는경우에서 두가지 경우로 작성해줄 수 있다. return문을 포함한 람다식 (statement가 된다. ;를 붙여야 된다...
스프링 빈의 의존관계 방법은 두가지가 존재한다 컴포넌트 스캔과 자동 의존 관계 설정 자바 코드로 직접 스프링 빈 등록하기( = 설정 파일에 직접 빈을 등록하는 방법) 각 방법별로 어떻게 스프링 빈을 설정하는지 살펴보자 컴포넌트 스캔과 자동 의존관계 설정 컴포넌트 스캔의 정의는 @Component를 가진 모든 대상을 가져와 빈에 등록하기 위해 찾는 과정을 의미한다. 아래와 같은 MemberController 컨트롤러 클래스가 있다고 가정하자 package hello.hellospring.controller; import hello.hellospring.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; i..
테스트코드를 작성하는 궁극적인 목표는 잘 작동하는 깔끔한 코드를 얻기 위함이다. 왜 테스트코드를 통해 깔끔한 코드를 얻을 수 있을까? 그 이유는 테스트를 하기 위해서 애플리케이션 코드를 쉽게 작성하게 되기 때문이다. 아래와 같은 service요소의 MemberService클래스가 있다고 가정하자 package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import hello.hellospring.repository.MemoryMemberRepository; import java.util.List; import java.util.Opt..
가장 일반적인 웹 애플리케이션 계층 구조를 살펴보자 각 계층별 역할은 아래와 같다 Controller : MVC방식에서의 Controller 역할과 동일하다 Service : 핵심 로직을 구현한다 Repository : DB에 접근하거나, Domain 객체를 DB에 저장 / 관리한다 Domain : 애플리케이션의 도메인 객체이다. 도메인 객체에는 회원, 주문, 쿠폰번호등이 해당되며, DB에 저장 / 관리된다.
Hoplin
Hoplin의 개발일기