표준 함수형 인터페이스 java.util.function 패키지에는 총 43개의 함수형 인터페이스를 제공합니다. 이 중 6개 정도만 기억하면 나머지도 유추하기 쉽습니다. UnaryOperator T apply(T t): 반환값과 인수의 타입..
메서드 참조 List.of(1, 2, 3, 4).forEach(i -> System.out.println(i)); List.of(1, 2, 3, 4).forEach(System.out::println); // 메서드 참조 메서드 참조를 사용할 때 주의사항 대부분의 경우 람다에 비해 코드..
람다의 장점 람다식은 메서드가 하는 일을 보다 간결하고 읽기 쉽게 표현합니다. 익명 클래스로 작성된 코드입니다. Collection.sort(words, new Comparator () { public int compare(String s1, String s2){ retu..
마커 인터페이스 일반적인 인터페이스와 동일하지만 아무 메서드도 선언하지 않은 형태의 인터페이스입니다. 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하기 위해 사용합니다. 대표적인 마커 인터페이스로..
@Override @Override 애너테이션은 메서드 선언에만 달 수 있으며, 해당 메서드가 상위 타입의 메서드를 재정의했다는 것을 알려줍니다. 붙이지 않아도 컴파일 오류가 나지 않지만 버그를 예방할 수 있기 때문에..
명명 패턴 Junit 3 까지 테스트 메서드의 이름이 test 로 시작해야만 했던 것과 같이 이름을 짓는 규칙 명명 패턴의 문제 오타 올바른 프로그램 요소만 사용되리란 보증이 없음 프로그램 요소를 매개변수로 전달할..
열거 타입과 확장 열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하지만 확장하는 것은 좋지 않음 확장 타입의 원소는 기반 타입의 원소로 취급하지만 그 반대는 성립하지 않음 기반 타입과 확장..
예제코드 public class Plant { enum LifeCycle { ANNUAL, PERNNIAL, BIENNIAL} final String name; final LifeCycle lifeCycle; public Plant(String name, LifeCycle lifeCycle) { this.name = name; this.lifeC..
비트 필드 열거 상수 열거한 값들이 주로 집합으로 사용되는 경우, 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴 public class Text { public static final int STYLE_BOLD = 1 << 0; public sta..
제네릭은 Set , Map 등의 컬렉션과 TreadLocal 등의 단일원소 컨테이너에도 흔히 사용됩니다. 이런 모든 쓰임에서 매개변수화 되는 대상은 원소가 아닌 컨테이너 자신입니다. 따라서 하나의 컨테이너에서 매개변수..
가변인수(varargs) 메서드에 넘기는 인수의 개수를 클라이언트가 조절할 수 있게 해주는데, 컴파일시 배열로 처리 됩니다. 따라서 가변인수 매개변수에 제네릭이나 매개변수화 타입이 포함되면 아래와 같은 컴파일..
Item28에서 정리했던 것 처럼 매개변수화 타입은 불공변(invariant)입니다. 즉, List 은 List 의 하위타입이 아닙니다. 일반적으로는 이렇게 되는 것이 맞는 것 같습니다. 하지만 List 에 Integer 타입을 추가하고..
클래스와 마찬가지로 메서드도 제네릭으로 만들 수 있습니다. 매개변수화 타입을 받는 정적 유틸 메서드는 보통 제네릭입니다. 제네릭 메서드 작성법은 제네릭 타입 작성법과 비슷합니다. public static Set unio..
public enum Role { CUSTOMER, SHOP_MANAGER; public int getAuth() { return ordinal(); } } 알바( PART_TIMER )를 추가 public enum Role { CUSTOMER, PART_TIMER, SHOP_MANAGER; public int getAuth() { return..
정수 열거 패턴(int enum pattern) - 사용 X 열거 타입이 생기기 전 공통적으로 사용되는 상수를 한데 묶어서 사용했었습니다. public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN =..
클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편합니다. 이를 위해서는 제네릭 타입으로 만들어야 할 경우가 많습니다. 새로운 타입을 설계할 때 뿐만 아니라 기존 타입 중 제네..
리스트가 사용하기 더 편한 것을 제외하고서라도 배열보다는 리스트의 사용을 권장하는 이유가 있습니다. 배열은 공변이고 실체화되는 반면, 제네릭은 불공변이고 타입 정보가 소거됩니다. 그 결과 배열은 런타임..
제네릭을 사용하면 비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등 수 많은 컴파일 경고를 볼 수 있습니다. 이 중 제거하기 쉬운 경고도 있지만 제거..
로 타입(raw type)을 알기전에 제네릭을 알아야 합니다. 제네릭 클래스와 인터페이스 선언에 타입 매개변수(type parameter)가 쓰이면, 이를 제네릭 클래스, 제네릭 인터페이스라 합니다. List인터페이스는 원소의..
톱레벨 클래스는 서로 다른 소스 파일로 분리합니다. 굳이 한 파일에 담고 싶다면 정적 멤버 클래스로 만들어서 한 파일에 담을 수 있습니다. 이때 private 으로 선언하면 접근 범위도 최소로 관리할 수 있습니다.
Preferences > File and Code Templates > Code탭 > Junit5 Test Class > import static org.assertj.core.api.Assertions.*; 추가
중첩 클래스(nested class) 클래스 안에 정의된 클래스로 자신을 감싼 바깥 클래스에서만 쓰여야 합니다. 만약 그 외에 쓰임새가 있다면 톱레벨 클래스로 만들어야합니다. 중첩 클래스의 종류는 정적 멤버 클래스..
public class Figure { enum Shape { RECTANGLE, CIRCLE } //태그 필드 final Shape shape; //Shape가 RECTANGLE일 때만 사용 double length; double width; //Shape가 CIRCLE일 때만 사용 double radius; //RECTA..
인터페이스의 용도 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 합니다. 인터페이스는 오로지 이 용도로만 사용해야 합니다. 상수 인터페이스 안티패턴 상수 인터페이스란 메서드 없이, static..
인터페이스에 메서드를 추가 자바 8이후 디폴트 메서드를 통해 기존 인터페이스에 메서드를 추가할 수 있게 되었습니다. 하지만 아래와 같은 이유로 디폴트 메서드의 추가는 신중해야합니다. 디폴트 메서드를 재정..
추상클래스와 인터페이스 자바는 추상 클래스와 인터페이스로 다중 구현 메커니즘을 제공합니다. 자바 8부터 인터페이스도 디폴트 메서드를 제공할 수 있게 되어 두 메커니즘 모두 인스턴스 메서드를 구현 형태로..
메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 합니다. 달리 말하면 재정의 할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 합니다. API문서의 메서드 설명 끝..
여기서 말하는 상속은 다른 클래스를 확장하는 구현 상속입니다. 상속의 문제점 메서드 호출과 달리 상속은 캡슐화를 깨뜨립니다. 상위 클래스는 내부 구현이 달라질 수 있으며, 이로 인해 하위 클래스의 동작에..
불변 클래스의 정의 인스턴스의 내부 값을 수정할 수 없는 클래스로 객체가 파괴되는 순간까지 절대 달라지지 않습니다. 대표적으로 String 클래스가 해당합니다. 불변 클래스의 장점 가변 클래스보다 설계, 구현,..
public 클래스는 모든 필드를 private으로 하고 접근자를 제공하는 것이 좋습니다. public class Member { private String name; private int age; public String getName() { return name; } public int getAge()..
캡슐화의 장점 개발속도 향상: 여러 컴포넌트를 병렬로 개발할 수 있기 때문 시스템 관리비용 감소: 빠른 파악 및 적은 교체 부담 성능 최적화에 도움: 캡슐화 자체가 성능을 높여주지는 않지만, 다른 컴포넌트에..
Casting - (String) null일 경우: 문자열 "null" 반환 기본형 타입인 경우: 컴파일에러 (대신 빈 문자열을 더하면 됨, String str = 10 + ""; String이 아닌 참조형인 경우: ClassCastException 예외 발생 toStrin..
Comparable와 compareTo Comparable는 compareTo 메서드를 하나만 갖고있는 있는 인터페이스입니다. compareTo 메서드는 두 가지 성격만 빼면 eqauls와 같습니다. compareTo는 동치성 비교 뿐아니라 순서까지 비교..
복제 기능은 (변환)생성자와 (변환)팩토리를 이용하는게 최고입니다. (배열은 예외적으로 clone 메서드를 사용하는 것이 좋습니다.) Cloneable 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스(mixin..
toString을 재정의하지 않으면 클래스이름@16진수의해시코드 를 반환합니다. 따라서 toString의 일반 규약에 따라서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야합니다. toString메서드는 println, printf,..
equals 재정의시 hashCode를 재정의하지 않으면 해당 클래스의 인스턴스를 HashMap, HashSet과 같은 컬렉션의 원소로 사용할 때 문제가 발생합니다. 논리적으로 같은 객체는 같은 해시코드를 반환해야합니다. hash..
equals를 재정의하면 안되는 경우 각 인스턴스가 본질적으로 고유한 경우: 값을 표현하는 것이 아닌 동작하는 개체를 표현하는 경우 인스턴스의 '논리적 동치성'을 검사할 일이 없는 경우 상위 클래스에서 재정의..
try-finally static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 예외..
사용하지 마세요 finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있습니다. 그래서 자바9 부터는 deprecated되었고 cleaner를 대안으로 소개합니다. 하지만 이 역시 finalizer보다는 덜 위험하지만, 예측할..
public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } publ..
String str = new String("Hello"); String str2 = "Hello"; String str = new String("Hello"); 가 실행될 때 마다 새로운 String 인스턴스를 만듭니다. 반면, String str2 = "Hello"; 는 여러번 실행되어도 새로..
의존 객체 주입 패턴 public SpellChecker { private static final Lexicon dictionary = new NaverLexicon(); } 이런 맞춤법 검사기가 있는 경우 DaumLexicon을 사용하거나 특수한 어휘사전을 사용할 수 없습니다..
인스턴스화를 막는 이유 java.lang.Math , java.util.Arrays 처럼 기본 타입 값이나 관련된 메서드를 모아 놓을 때 java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아..
싱글턴(Singleton)? 객체의 인스턴스를 오직 1개만 생성할 수 있는 클래스를 말합니다. 싱글턴을 만드는 방법 private생성자 + public static 필드를 통해 인스턴스에 접근 private생성자 + 정적 펙토리 메서드 열..
생성자에 매개변수가 많다면? 생성자(또는 정적 팩토리 메서드)는 선택적 매개변수가 많을 때 문제가 있습니다. public class User { private final String name; //필수 private final String birth; //필수 priv..
정적 펙토리 메서드(static factory method)란? 정적 펙토리 메서드에서 펙토리란 객체를 생성하는 역할을 이야기 합니다. 즉 객체를 생성하는 static method라고 생각하면 편합니다. 정적 팩토리 메서드의 장점(..
해당 컴퓨터에 설치되어 있지 않은 폰트인 경우 정확하게 동작하지 않습니다.
LAG함수와 LEAD함수의 정의 및 구조 LAG 함수 : 자체 조인을 사용하지 않고 이전 행을 리턴하는 함수 LEAD 함수: 자체 조인을 사용하지 않고 다음 행을 리턴하는 함수 LAG(expression [, offset] [, default]) OVE..
@ScriptAssert 를 사용하면 HV000232: No JSR 223 script engine found for language "javascript" 오류가 발생했습니다. 결론부터 얘기하면 jdk버전 문제였습니다. 조금 디테일하게는 JVM의 Javascript Engine 문..
영어가 이상하게 써질때 Alt + = 조합으로 원래대로 돌릴 수 있습니다. IntelliJ 뿐 아니라 Word, Excel, PowerPoint 등에서도 Alt + = 이 먹힙니다.
톰캣 10.0 공식문서에 의하면 캐시의 최대 크기는 10mb라고 합니다.(8.0, 9.0도 동일) The maximum size of the static resource cache in kilobytes. If not specified, the default value is 10240 (10 megabyte..
Preferences (환경설정) > Editor > Live Templates 우측의 +버튼 클릭 > Live Template 선택 Abbreviation: 단축어 Description: 단축어에 대한 설명 Template text: 단축어의 수행 기능 ( $END$부분에 커서가..
class MyClass implements MyInterface가 있을 때 MyInterface를 찾지 못했다고 오류 발생 Build메뉴의 Rebuild Project로 해결
me.study.MemberService를 구현한 me.study.MemberServiceImpl에서 이러한 문제가 발생했습니다. 빌드 하는 것은 문제가 없었지만 Problems에 뜨는 것도 보기 좋지 않았고 무엇보다 code completion(content assis..
The most significant changes since 2.5.0 are macOS Big Sur support on Intel, brew commands replacing all brew cask commands, the beginnings of macOS M1/Apple Silicon/ARM support and API deprecation..
USER라는 테이블을 생성합니다. CREATE TABLE USER ( ID VARCHAR2(10) ); 이 간단한 DDL은 ORA-00903: invalid table name 오류를 냅니다. 그 이유는 테이블명을 오라클 예약어로 사용했기때문입니다. CREATE TABL..
JVM(Java Virtual Machine) JVM이란? Java의 가장 큰 특징 중 하나는 OS(Operating system)에 독립적이라는 것 입니다. 먼저, 개발자가 .java 파일을 생성합니다. 이를 Java Compiler의 javac 라는 명령어를 이용..
위와 같은 테이블이 있을 때 SELECT @ROWNUM := @ROWNUM + 1 AS rownum, table.* FROM table, (SELECT @ROWNUM := 0) tmp ORDER BY birth ASC 역순으로 정렬하면서 rownum을 가져오고 싶은 경우 어떻게 해야 할..
괄호, 콤마가 빠진경우에 발생합니다.
반복문 내에 String 변수 선언하는 것은 성능에 나쁜 영향을 끼친다 라는 얘기를 어디선가 들은 적이 있습니다. 아마 반복문 내부에 변수를 선언하면 매 번 변수를 초기화하지 않을까 라는 생각에 이런 얘기를 하..
기본 키(Primary key)? 주 키 또는 프라이머리 키라고 하며, 관계형 데이터베이스에서 레코드의 식별자로 가장 적합한 것으로 선택, 정의된 후보 키입니다.(출처: 위키백과) 기본 키의 (제약) 조건 기본 키는 데이..
Persistence Context EntityManager로 Entity를 저장하거나 조회하면 EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리합니다. 영속성 컨텍스트는 논리적인 개념에 가까우며 EntityManager를 생성 할 때..
환경설정 > Editor > General > Auto Import > 아래 스크린샷의 체크박스부분 체크 > 저장
Entity 테이블에 대응하는 클래스입니다. Entities in JPA are nothing but POJOs representing data that can be persisted to the database. An entity represents a table stored in a database. Every instanc..
터미널에 mvn clean compile -DskipTests
동작중인 컨테이너 확인 $ docker ps 모든 컨테이너 확인 $ docker ps -a 컨테이너 삭제 $ docker rm [컨테이너ID] 컨테이터 여러개 삭제 $ docker rm [컨테이너ID], [컨테이너ID] 컨테이너 전부 삭제 $ docker rm..
brew cask가 dedeprecated되고 그냥 brew install로 설치할 수 있도록 변경되었습니다.(--cask옵션을 줘도 됩니다.) $ brew install docker docker-machine $ brew install virtualbox -> System Preference > Sec..
gitignore가 적용이 안될 때가 있습니다. git의 캐시 문제로 캐시를 삭제해 주고 다시 커밋하면 됩니다. git rm -r --cached . git add . git commit 처음에 이 명령어를 봤을 때 .이 안보여서 git rm -r --cached..
Spring Framework (Core) 프레임워크 전체를 가리키는 동시에 프레임워크의 핵심부분을 가리키기도 합니다. DI를 위한 단독 프레임워크로 개발돼었습니다. DI 기능은 다른 라이브러리와 상관없이 개별적으로 사용..
문자열을 split(".") 할 때 결과값으로 공백이 나오는 경우가 있습니다. 이는 split() 메서드가 정규식으로 작동하기 때문입니다. 그럼 . 으로 자를 때 어떻게 잘라야 하는지 알아보겠습니다. public class split..
IoC(Inversion of Control) 제어의 역전이란 뜻입니다. 초기에는 개발자가 객체를 생성하고 의존관계를 직접 설정하였는데 이를 제어라고 합니다. 이 제어라는 행동을 컨테이너라는 것에 맡기는 것을 제어권이 역..
List 중복제거 List는 기본적으로 중복을 허용합니다. 하지만 때때로 필요에 따라 List의 중복을 제거해야 할 때가 있습니다. 오늘은 List의 중복을 제거하는 방법에 대해 알아보겠습니다. public class ListDisti..
지난 시간에는 AOP를 xml 스키마 기반으로 구현해봤습니다. 이번에는 @Aspect 어노테이션을 통해 구현해보도록 하겠습니다. 전의 소스를 대부분 재활용 했습니다. public interface Attendance { public void Atte..
Persistence(영속성) 프로세스가 생성했지만 별개로 유지되는 상태의 특징 즉, 프로그램이 종료되더라도 데이터가 사라지지 않는 특성을 뜻합니다. Persistence Layer Layered Architecture의 구성요소 중 하나입..
마지막 commit 날짜를 오늘로 설정 git commit --amend --no-edit --date "${date)" 마지막 commit 날짜를 임의의 날짜로 설정 git commit --amend --no-edit --date "Tue 7 Jul 2020 22:43:20 KST" git에는 autho..
AOP 구현 스프링 AOP를 구현하는 방법에는 두가지가 있습니다. XML 스키마 기반의 자바 POJO 클래스를 이용하여 구현 @Aspect 어노테이션 이용하여 구현 POJO(Plain Old Java Object) 순수한 자바 객체를 의미합니..
AOP Aspect Oriented Programming의 약자로, 관점(관심,기능) 지향 프로그램이란 뜻입니다. 공통 기능과 핵심 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법입니다. AOP의 기본 개념은 핵심 기능에 공..
@Autowired, @Resource, @Inject의 역할 세 어노테이션의 공통점은 자동 의존 주입(DI) 입니다. @Autowired, @Resource, @Inject의 차이점 @Autowired @Resource @Inject 지원 Spring Framework에서 지원 Java에서..
오류발생 어제까지 잘만되던 MySQL이 갑자기 접속오류가 발생했습니다. root 계정으로 로그인을 시도하니 ERROR 2003: Can't connect to MySQL server on 'localhost' (10061) 오류가 발생합니다. 보통 계정 비밀..
보통 자바를 처음 배울 때 String hello = "Hello, World"; 이렇게 작성 한 후 이걸 출력하는 예제를 따라칠 것 입니다. 그래서 자바를 처음 배우시는 분들은 new String() 에 대해 생소하실 수 도 있습니다. 오늘..
Mutable Object? Immutable Object? Immutable Object(불변객체)는 객체 생성 후 그 상태를 바꿀 수 없는 개체입니다. 다르게 말하면 할당 된 데이터를 바꿀 수 없는 객체입니다. 예를 들어 String[] arr = {"a",..
배열을 ArrayList로 변환 하는 방법을 알아보고 그 반대의 경우도 알아보겠습니다. 배열 => ArrayList ```java public static void main(String[] args) { String[] arr = {"The", "URL", "of", "my", "blog", "is..
final static LocalDateTime LOCAL_DATE_TIME = LocalDateTime.of(2020, 6, 29, 21, 55, 10); final static LocalDate LOCAL_DATE = LocalDate.of(2020, 6, 29); final static LocalTime LOCAL_TIME = LocalTime.o..
JDK 8 이전에는 java.util.Date , java.util.Calendar 클래스를 대체하기 위해서 Joda-Time 같은 오픈소스 라이브러리를 사용했었다고 합니다. 간단하게 위 두 클래스의 문제점을 알아보고 JDK 8부터 바뀐 Java의..
문제점 IntelliJ + Spring MVC + Maven 프로젝트에서 컴파일 시에 release version 5 not supported 가 발생했습니다. 원인 Project Structure > Project Settings > Modules의 Sources탭 > Language Level이 5로..
문제점 톰캣 로그가 한글로 나오는 경우가 있습니다. 해결방법 1. catalina.sh 열기 CATALINA_HOME/bin/catalina.sh를 텍스트 편집기로 엽니다. 2. JAVA_OPTS에 옵션 추가 JAVA_OPTS에 -Duser.language=en 을..
Create New Project 버튼을 클릭합니다. Maven 을 선택합니다. 프로젝트 정보를 입력합니다. 프로젝트가 생성되면 프로젝트를 우클릭하여 Add Framework Support... 을 클릭합니다. Web Application 을 체크합..
SQL문은 다루는 객체, 용도에 따라 DDL, DML, DCL(+TCL)로 분류 할 수 있습니다. DCL에서 COMMIT , ROLLBACK , SAVEPOINT 를 따로 분리하여 TCL(Transaction Control Languaage)라고 표현하기도 합니다. 각각 어떤..
Spring에서 유효성을 검사하는 방법 Spring Validator 구현 Bean Validation Bean Validation 1.0(JSR-303) Bean Validation 1.1(JSR-349) Bean Validation 2.0(JSR-380) 두 가지 방법 중 Validator 인터페이스를..
복사의 종류 객체를 복사하는 유형은 객체의 주소를 복사하는 얕은 복사(Shallow Copy)와 객체를 완전히 복사하는 깊은 복사(Deep Copy)가 있습니다. 얕은 복사 객체의 주소를 복사하기 때문에 여러 객체가 같은..
Homebrew 로 톰캣을 설치하면 환경변수가 tomcat/버전/libexec/bin으로 잡혀있습니다. 물론, 톰캣 실행은 아래의 명령어로도 실행할 수 있습니다. /usr/local/opt/tomcat/bin/catalina run
오류내용 java.rmi.server.ExportException: Port already in use 원인 기존에 사용중인 1099 포트가 정상종료되지 않고 재시작할 경우 발생합니 해결방법 1. PID 찾기 lsof -i :포트번호 터미널에서 losf -i :10..
H2 Database H2 Database는 자바로 작성된 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 공식 홈페이지에서 설명하는 H2 Database의 특징은 다음과 같습니다. 매우 빠른 JDBC API 오픈 소스 (Very fast, open s..
git clone https://github.com/dracula/iterm.git Dracula 테마를 다운로드 받습니다. 다운로드 받은 디렉토리의 Dracula.itermcolors 파일을 더블클릭하면 자동으로 iTerm2 테마에 추가됩니다. iTerm2의 설정..
Wrapper class ArrayList nubmers = new ArrayList (); // Invalid ArrayList numbers = new ArrayList (); // Valid primitive type의 데이터를 객체로 취급해야 하는 경우가 있습니다. 이럴 경우 primitive type..
차이점 java.util.Date 유닉스 시간(1970년 1월 1일 00:00:00 GMT)으로 부터 지정된 시간(milliseconds)을 년/월/일/시/분/초 의 형태로 갖고 있습니다. java.sql.Date java.util.Date 를 상속받으며 SQL Date 값..
Preferences > Editor > General > Code Completion > Match case 를 해제합니다.
Homebrew? Homebrew는 macOS용 패키지 관리 시스템입니다. cli 도구뿐 아니라 cask 를 통해 macOS 애플리케이션을 설치할 수도 있습니다. Homebrew 설치 아래 스크립트를 복사하여 터미널에 붙여 넣습니다. /bin/..
마크다운? 마크다운은 텍스트를 HTML로 변환하는 도구입니다. 확장자는 .md (또는 .markdown )이며 content-type은 text/markdown 입니다. 마크다운의 장, 단점 장점 간결합니다. 별도의 도구 없이 작성 가능합니..