API란? 기본적인 API의 의미는 Application Programming Interface의 약자이다. 이는 일종의 소프트웨어 인터페이스이며, Third Party 소프트웨어를 제작하거나, 관련 소프트웨어 제작 인터페이스를 제공하는것을 의미한다. 다만, 웹에서의 API의 의미는 개발자가 브라우저 상에 쉽게 개발할 수 있도록 도와주는 객체 모음이다.웹 API는 객체 기반으로 동작하며, 엔트리 포인트가 존재한다. 기본적인 Spring API 방식 String 타입 Response 우선 아래와 같은 코드를 보자 @Controller public class HelloController { // Basic API Returns String @GetMapping("hello-spring") @ResponseB..
MVC? MVC패턴은 디자인 패턴중 하나이다. Model, View, Controller의 약자이며, 각각 서로 맡은 책임을 기반으로 프로젝트가 구상된다. Model : 주로 DB 접근을 한다 View : Template관련 책임을 맡는다. Django에서는 Template이 View의 역할을 한다. Controller : Request에 대해, Template엔진연결, 필요한 Model 접근등,전반적인 통제 역할을 한다. Django에서는 View가 Controller 역할을한다 스프링에서 기본적인 Controller, View 방식 사용해보기 컨트롤러는 아래와 같이 작성해 주었다. @RequestParam을 사용하면 URL을 통해 매개변수를 받을 수 있다. @RequestParam의 매개변수중 val..
정적 컨텐츠란 서버에서 따로 프로그래밍적 처리 없이 파일을 바로 클라이언트에 전달하는 방식을 의미한다. 예를들면 Spring Welcome Page를 예로 들 수 있다. 스프링 Static Content 관련 Document를 살펴보자 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#web.servlet.spring-mvc.static-content Spring Boot Reference Documentation This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-conf..
1. Welcome Page? 기본적으로 스프링 프로젝트를 초기화하고 디폴트 클래스를 실행하면 아래와 같이 에러페이지가 나온다 이는 첫 페이지에 매핑된 페이지가 없어서 출력하는 에러페이지이다. 스프링에서는 Welcome Page 기능이 있다. Welcome page란 처음 들어갔을때 표시되는 기본 페이지를 의미한다. https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#web.servlet.spring-mvc.welcome-page Spring Boot Reference Documentation This section goes into more detail about how you should use Spring Boot. It co..
1. 개발환경 개발환경은 아래와 같이 사용한다 PC : Mac(m1) Java Version : 11 https://www.azul.com/downloads/?version=java-11-lts&os=macos&architecture=arm-64-bit&package=jdk Downloads Download Azul Platform Prime Azul Platform Prime extends Core, adding unique Azul innovations to improve the runtime characteristics of Java workloads. Azul Platform Prime delivers added performance, scale, consistency, and efficiency..
list-style-type list-style-type속성은 불릿()의 모양이나 번호() 스타일을 지정할 때 사용한다. 지정할 수 있는 대표적인 속성들은 아래와 같다. 종류 설명 disc / circle 채운 원 모양 / 빈 원 모양 square 채운 사각형 decimal / decimal-leading-zero 1부터 시작하는 10진수 / 앞에 0이 붙는 10진수 lower-roman / upper-roman 로마 숫자 소문자 / 로마숫자 대문자 none 불릿 / 숫자를 없앤다 Test1 Test2 Test3 Test1 Test2 Test3 list-style-position list-style-position 속성을 사용하면, 번호의 위치를 들여쓸 수 있다. 두가지 속성이 있다. inside : 불..
text-shadow 텍스트에 그림자 효과를 주는 속성이다. 아래와 같은 형식으로 작성한다. text-shadow : 아래와 같이 텍스트에 그림자 효과가 적용된다,. 예시 코드는 아래와 같다. HTML CSS JS text-transform 영문자 표기시 텍스트의 대소문자를 원하는대로 바꿀 수 있다. text-transform속성은 아래와 같다. capitalize : 첫번쨰 글자를 대문자로 바꾼다 uppercase : 모든 글자를 대문자로 변경한다 lowercase. : 모든 글자를 소문자로 변경한다. 예제 코드는 아래와 같다. html css JS letter-spacing letter-spcing속성은 글자 사이 간격을 조절해 준다. px, em과 같은 단위나 퍼센트로 조절해 줄 수 있다. 예제 코..
클래스 지정자 태그 속성중 'class'를 명시한 태그에 대해 선택을 하기 위해서는 아래와 같이 '.' 기호를 사용해서 지정해 주면 된다 .클래스명 {css 규칙들} 예제 코드로 아래와 같이 작성할 수 있다. paragraph, bg라는 값의 클래스를 가진것에 대해 모두 적용되는것을 볼 수 있다. What is Lorem Ipsum? Lorem Ipsum is simply dummy text of the printing and typesetting industry.Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scramble..
이 포스트에서는 input태그의 placeholder,readonly, autofocus 세가지 속성을 살펴볼 것이다. placeholder placholder는 입력란에 힌트를 표시해줄 때 사용하는 속성이다. 아래 코드와 같이 input 태그에 "Type text here"라는 값을 가진 placeholder 속성을 넣어준다고 가정하자. Test Test Form 결과를 보면 폼에 Type text here라는 힌트가 나오는것을 볼 수 있다. readonly readonly는 사용자가 입력 / 편집을 못하게 막고, 읽기만 가능한 읽기전용 필드를 만들 때 사용한다. readonly를 위해서는 "디폴트 값"이라는걸 넣어주어야할 때가 있는데, 이때는 value속성에 값을 지정해 주면 된다. Test Test..
input 태그 input 태그에는 'type'이라는 속성이 존재한다. https://developer.mozilla.org/ko/docs/Web/HTML/Element/Input#%3Cinput%3E_%EC%9C%A0%ED%98%95 : 입력 요소 - HTML: Hypertext Markup Language | MDN HTML 요소는 웹 기반 양식에서 사용자의 데이터를 받을 수 있는 대화형 컨트롤을 생성합니다. developer.mozilla.org 이 타입은 여러가지 속성이 있지만, 그 중 항목을 선택하는 'radio'와 'checkbox'를 비교해 보고자 한다. 우선 이 두개 다 어떻게 출력되는지 보자. type = "radio" Radio Field Radio Field Test Yes No Su..
아래와 같은 VIew가 있다고 가정하자. 이 View는 함수형 View로 작성이 되어있다. 이 함수형 View를 클래스형 View로 바꿔보자 from django.shortcuts import get_object_or_404, render,redirect from django.http import HttpResponseRedirect from django.urls import reverse from polls.models import Choice, Question def index(request): latest_question_list = Question.objects.all().order_by('-pub_date')[:5] context = {'latest_question_list': latest_qu..
Class View를 작성하다 보면 Template에게 context변수들을 전달하기 위해서 get_context_data()메소드를 오버라이딩 하여 사용한다. 그리고 주의할 점은 get_context_data()를 오버라이딩 한 후 super().get_context_data()를 꼭 작성해 주어야한다. 기본 타입은 아래와 같은 형태를 띄고 있다. class TestView(TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data() return context 그렇다면 이 get_context_data()는 어떤 방식으로 작동하며 왜 super().get_context_data() 꼭 작성해 주어야하며 ..
apps.py? django application을 생성하면 여러 파일들이 생기는데 그중 apps.py라는 파일이 있다. 이 파일은 프로젝트 디렉토리의 settings.py에 INSTALLED_APPS에 디폴트 app 클래스를 등록하여 프로젝트 애플리케이션을 등록해 사용하곤 한다. 아래와 같이 말이다. 위 사진을 보면 Books.Config라는 클래스를 INSTALLED_APPS에 등록해주어 사용한다. apps.py의 활용 그렇다면 단지 apps.py는 이러한 용도만 있을까? 이외 용도가 더 있다. 예를 들어 홈화면을 만드는 코드라고 가정하자. 홈화면에는 각 모델들의 index페이지로 들어가는 링크들이 있다고 가정하자. # Project Directory's : views.py from django.vi..
클래스형 뷰? View는 요청을 받아 응답을 반환해주는 호출 가능한 "객체"이다. 함수로도 뷰를 작성할 수 있지만, 클래스로도 작성을 해줄 수 있다. 클래스로 작성된 뷰를 "클래스형 뷰"라고 부르며, 이를 사용하면 상속과 믹스인 기능을 사용해 코드를 재사용할 수 있고, 뷰를 체계적으로 작성할 수 있다. 클래스형 뷰의 시작점 앞에서 함수형으로 뷰를 작성할 때는 아래와 같은 형태로 작성을 하였다. urlpatterns = [ path('', views.index,name = 'index'), path('/',views.detail,name='detail'), path('/results/',views.results,name='results'), path('/vote/',views.vote,name='vote'..
Maven? Maven은 Java용 프로젝트 관리 툴이다. Apache Ant를 대체하기 위해 만들어 졌으며, 컴파일,테스트, Javadoc생성, 테스트 리포트 생성, 프로젝트 사이트 생성, JAR생성, 서버에 Deploy(전개 / 배포) 등의 기능들을 가지고 있다. pom.xml의 태그에 프로젝트에서 사용할 JAR라이브러리 이름, 버전을 지정함으로서 외부 사이트에서 관리되고 있는 JAR을 자동으로 다운로드하고, 로컬에서 빌드가 가능하다. Maven설치하기 1. brew install gcc 2. Maven 설치하기 : brew install maven은 openjdk가 같이 설치되므로아래 링크로 들어가서 Binary tar.gz archive를 다운로드해줍니다. https://maven.apache.o..
슬라이스 슬라이스란 Go언어에서 제공하는 동적배열이다. 동적배열이란 자동으로 배열 크기를 증가시키는 자료구조이다. 슬라이싱 기능을 이용해 배열의 일부를 나타내는 슬라이스를 만들 수 있다. 슬라이스 선언 var (변수명) [](자료형) 배열과 비슷하지만, 배열과 달리 배열 요소 최대 개수를 적지 않는다. 슬라이스를 초기화하지 않으면 길이가 0인 슬라이스가 만들어진다. 슬라이스 길이를 초과해 접근하면 런타임 에러가 발생한다. 슬라이스에 대한 인덱싱은 배열과 동일하다. package main import "fmt" func main() { var slice []int fmt.Println(slice[1]) } /* /private/var/folders/bv/hfxy36vd6_5f_4959zpp0lp40000g..
Django에서는 form을 생성하는 클래스를 제공한다. 이는 django.forms.Form클래스를 상속해서 만들 수 있다. class NameForm(forms.Form): # CharField타입의 디폴트는 TextInput위젯이다. 만약 textarea로 변경하려면 widget=forms.Textarea로 변경해주어야한다. your_name = forms.CharField(label="Your Name",max_length=100) your_name2 = forms.CharField(label="Your Name 2", max_length=100, widget=forms.Textarea) 위 예제는 두개의 필드가 있는 폼 클래스이다. 기본적으로 label속성은 각 별 태그의 값을 의미하고, 이는 ..
Django는 템플릿을 상속시킬 수 있는 기능을 가지고 있다. 템플릿 상속의 장점은 템플릿 코드를 재사용할 수 있다 사이트의 룩 앤 필을 일관성있게 보여줄수 있다 와 같은 장점들이 있다. 부모 템플릿은 뼈대를 만들고, {% block %}태그를 통해 하위로 상속해줄 부분을 지정해 주면, 자식 템플릿은 부모 템플릿의 뼈대를 그대로 재사용하고 {% block %}부분만 채워주면 된다. 채워줄때는 부모 템플릿에서 지정한 블럭 이름을 block 옆에 붙여 채우고자 하는 블럭을 지정해주면 된다. {% block sidebar %} Home {% endblock %} {% block content %} {% endblock %} {% extends "inheritTest/parent.html" %} {% block..
개요 Go언어는 클래스개념이 존재하지 않는다. 대신 구조체를 클래스 같이 사용하고, 메소드를 구조체 밖에 선언하는 형태로 사용한다.이 외 특징으로는 OOP특성중 하나인 상속성(inheritance)를 지원하지 않고, 인터페이스(interface)를 지원한다. 우선 이 포스트에서는 구조체, 메소드에 대해서 알아보자 구조체 구조체 기본 메소드를 알기 전에 구조체를 알아야 한다. C언어를 했다면 구조체를 접했을 것이다. 구조체는 여러 필드를 묶어서 작성한다. 배열이 같은 타입 값들을 변수 하나로 묶어주었다면, 구조체는 여러 타입의 값들을 변수 하나로 묶어주는 기능을 한다. 기본적인 선언은 아래와 같다. type (type name) struct{ (field name) (field value type) } 예..
Django 템플릿 시스템은 템플릿 문법으로 작성된 템플릿 코드를 해석해 템플릿 파일로 결과물을 만들어준다. 템플릿 코드를 템플릿 파일로 해석하는 과정을 장고에서 '렌더링' 이라고 부른다. 템플릿 변수 템플릿 코드에서 변수를 사용할 수 있다. 변수는 아래와 같은 형식을 사용한다. {{ variable }} 변수 속성에 접근하기 위해서 '.' 연산자가 있는데 이 연산자 해석은 아래와 같다. Dictionary타입인지 확인한다. 딕셔너리 타입인 경우 key값으로 해석한다 변수의 속성을 찾는다. 있다면 해당 변수의 속성으로 해석한다 리스트 속성인지 확인한다. 리스트 속성이면 인덱싱을 한다 위 세가지 모두 아닌경우 빈 문자열로 반환한다. 만약 이 반환되는 문자열을 바꾸고 싶다면 settings.py의 TEMPL..
Django는 파이썬 쉘을 이용해 데이터를 관리할 수 있는 API를 제공한다. ORM을 통해서 데이터에 대한 CRUD를 실습해보자 CRUD는 아래 네가지를 일컫는 말이다. Create Read Update Delete Django 쉘을 사용하기 위해서는 아래 명령어를 입력해 준다. python3 manage.py shell Create : 데이터 생성 / 입력 테이블에 레코드를 생성하는 것이다. 레코드를 생성하기 위해서는 필드값을 지정해 객체를 생성한다. 레코드를 생성해준 뒤에는 꼭 save()메소드를 호출해 주어야 한다. 이 이유는 save()명령을 실행하기 전에는 메모리에서만 변경이 되기 때문이다. 이는 SQL용어의 INSERT랑 동일하다. Read : 데이터 조회 데이터베이스로 부터 데이터를 조회하..
기본적으로 생성되는 장고 어드민 페이지 title은 아래와 같이 Django administration이라는 값으로 설정되어있다 이 값을 바꾸기 위해서는 프로젝트 디렉토리의 urls.py에서 설정해주면 된다. django.contrib 의 admin을 import 해준다. 그 다음 admin site의 site header, index title, site title변수를 오버라이딩 해서 재정의해주면 된다. // 프로젝트 디렉토리의 urls.py from django.contrib import admin from django.urls import path,include admin.site.site_header = "Simple Vote System" admin.site.index_title = "Adm..
models.py class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField(verbose_name='date_published') def __str__(self): return self.question_text 어드민 사이트에 등록할 모델 클래스(models.ModelAdmin상속 받은 클래스)에 search_fields를 추가하면 검색 박스를 표시할 수 있다. 검색 박스에 단어를 입력하면 'LIKE'쿼리를 이용해서 question_text필드를 검색한다. search_fields에 여러 필드를 지정하면 지정된 필드들에 대해 입력된 단어를 검색한다. # Regist..
models.py class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField(verbose_name='date_published') def __str__(self): return self.question_text 어드민 페이지에 등록할 모델 클래스에 list_filter속성을 추가하면 우측에 필터 사이드 바를 붙일 수 있다. 이 필터에는 모델의 필드 타입에 따라 적절한 항목들을 보여준다. 아래 예시에서는 pub_date는 DateTimeField이므로 이에 맞게 옵션을 제공하는 것이다.
models.py class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField(verbose_name='date_published') def __str__(self): return self.question_text admin사이트에 들어가서 테이블 레코드 리스트를 보면 아래와 같이 나타난다. 여기에 나타나는 제목들은 각 모델들의 __str__()메소드의 리턴값을 레코드 제목으로 사용한다. class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateT..
models.py 아래와 같이 모델들이 선언되어있다고 하자, Question는 Choice의 Foreign Key이다. 즉 서로 연관된 데이터라는 의미이다. 연관된 데이터인 만큼 데이터 CRUD를 할때 같은 한 페이지에서 관리하면 더 좋다 class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField(verbose_name='date_published') def __str__(self): return self.question_text class Choice(models.Model): question = models.ForeignKey(Question,on_delete=m..
배열 선언 방법 var t [5]float64 var 변수명 [요소개수]타입 형태로 선언하면 된다. 배열 초기화를 위해서는 아래와 같은 형태로 초기화하면된다. 또한 배열의 indexing은 일반적인 다른 언어와 동일하다(배열[index]) var t [5]float64 = [5]float64{24.0, 25.9, 27.8, 26.9, 26.2} package main import "fmt" func main() { var t [5]float64 = [5]float64{24.0, 25.9, 27.8, 26.9, 26.2} for i := 0; i < len(t); i++ { fmt.Println(t[i]) } } 배열 요소의 개수를 '...'를 이용해 생략할 수 도 있다. 이때 정해지는 배열 요소 개수는 ..
GO의 함수 선언하기 // func (함수명)(매개변수)(반환타입) func Add(a int, b int) int { } 함수 선언시 주의할점 두가지는 아래와 같다 함수명 첫 글자가 대문자이면 함수는 패키지 외부로 공개된다 반환값이 없는경우(void) 비워둔다 멀티 반환함수 함수는 값을 여러개 반환할 수 있다. 반환값이 여럿일 경우 반환타입들을 소괄호로 묶어 표현한다. package main import "fmt" // 함수명 첫글자가 대문자이므로 패키지 외부로 공개된다. func Divide(a, b int) (int, bool) { if b == 0 { return 0, false } return a / b, true } func main() { c, success := Divide(9, 3) fm..
표준 입출력 프로그램과 사용자는 입력 / 출력 을 통해 상호작용을 한다 이는 운영체제가 제공하는 표준 입출력스트림(Standard I/O)를 통해 이루어 진다. Go언어에서는 fmt 패키지를 이용해서 처리할 수 있다. 표준 출력 3가지 표준 출력에는 총 3가지 함수가 있다. Print() : 함수 입력값들을 출력한다 Println() : 함수 입력값들을 출력하고 개행(\n)한다 Printf() : format에 맞도록 입력값을 출력한다. package main import "fmt" func main() { var a int = 10 b := 20 var f float64 = 327999.8297 fmt.Println("a : ", a) fmt.Print("b : ", b) fmt.Printf("a : ..
패키지 패키지는 Go언어에서 코드를 묶는 가장 큰 단위이다. main 패키지 main패키지는 프로그램 시작점을 포함한 패키지이다. 운영체제는 프로그램을 실행하기 위해 프로그램을 메모리에 옮기고(이러한 작업을 load라고한다) 한줄한줄 시작하게 된다. 시작하는 점이 main()함수가 되는것이다. 이외 패키지 하나의 프로그램은 main패키지 이외 다른 패키지를 가질 수 있다.(장고가 프로젝트 디렉토리 이외에 여러가지 애플리케이션을 가질수 있는것과 비슷) 내장 패키지도 있지만, 오픈 소스로 공개된 여러 패키지와 유료 패키지 등 가져다가 사용할 수 있는 패키지도 많다. 패키지를 검색하려면 아래 두가지 방법을 사용하면 된다 표준 패키지 : https://pkg.go.dev/std 개발자들이 많이 사용하는 패키지(..