반응형

Intro

안녕하세요. 최근 회사에서 대용량 데이터 처리 관련 업무를 하며 GPU에 대한 관심을 갖게 되었습니다. 컴퓨터 성능에 관심이 있다면, CPU와 GPU라는 용어를 들어본 적이 있을 것입니다. 이 두 가지는 현대 컴퓨터 시스템에서 핵심적인 부품으로써 역할을 하며, 각각 고유한 기능과 특징을 갖고 있습니다. 이 글에서는 CPU와 GPU의 기본적인 기능과 차이점에 대해  설명하겠습니다.

 

CPU vs GPU

CPU (Central Processing Unit)란?

  • CPU는 컴퓨터의 두뇌로 불리는 중앙 처리 장치입니다. 주요 기능은 컴퓨터의 모든 연산과 작업을 관리하고 조정하는 것입니다. 컴퓨터의 주요 명령어를 해석하고 실행하는 역할을 수행하여 사용자와 시스템이 원활하게 상호작용할 수 있도록 합니다. 

CPU 특징

  • 제어 유닛(Control Unit): 명령어를 해석하고 실행하는 데 필요한 신호 제어
  • 산술 논리 연산 장치(ALU, Arithmetic Logic Unit): 산술 및 논리 연산 수행
  • 캐시 메모리(Cache Memory): CPU 내부에 위치하여 빠른 데이터 접근 지원
  • 스레드(Thread): 하나의 CPU 코어에서 동시에 여러 작업을 처리할 수 있는 스레드 지원


GPU (Graphics Processing Unit)란?

  • GPU는 그래픽 처리에 특화된 장치로서, 3D 그래픽 및 영상 처리 작업에 사용됩니다. 초기에는 그래픽 작업을 위해 개발되었지만, 현대의 GPU는 고성능 병렬 처리 능력을 갖추고 있어 일반적인 병렬 계산 작업에도 사용됩니다. 고성능 병렬 처리 능력을 갖추고 있기 때문에 비트코인 같은 채굴 연산에 많이 사용됩니다.

GPU 특징

  • 병렬 처리: 많은 코어로 구성되어 동시에 많은 연산을 병렬로 처리
  • 특수 목적: 주로 그래픽 연산을 위해 설계되었지만, GPGPU(General - Purpose computing on Graphics Processing Units) 기술을 통해 일반적인 계산에도 사용
  • 메모리 계층: CPU보다 큰 메모리를 가지며, 각 코어 당 작은 캐시 메모리를 갖고 있어 대규모 데이터 처리에 유리

CPU와 GPU의 차이

기능 및 용도

  • CPU는 일반적인 계산, 시스템 작업, 사용자 인터페이스 등 다양한 작업을 처리하는 데 사용
  • GPU는 그래픽 렌더링, 게임, 영상 편집, 인공지능, 데이터 마이닝 등 병렬 처리가 중요한 작업에 특화

코어의 구조

  • CPU는 몇 개의 코어(주로 2개~16개)를 가짐
  • GPU는 수백 개에서 수천 개의 코어를 가지며, 이는 대량의 데이터를 동시에 처리하는 데 유리

처리 방식

  • CPU는 순차적으로 작업을 처리하며, 각 코어가 하나의 작업을 순서대로 수행
  • GPU는 병렬 처리를 통해 많은 작업을 동시에 처리하며, 단일 작업을 여러 코어가 분담

속도와 성능

  • CPU는 단일 코어 당 높은 성능
  • GPU는 대량의 코어가 병렬 처리를 지원하여 대규모 데이터 처리에 뛰어난 성능을 보임

전력 소비

  • CPU는 전력 소비가 적으며, 에너지 효율적임
  • GPU는 많은 코어로 인해 전력 소비가 높을 수 있음

(※ 그림으로 보면 GPU에 CPU가 여러 개 들어 있는 걸로 보이지만 아니다. CPU의 단순 계산적 기능적인 부분을 GPU가 병렬 처리하는 부분을 쉽게 설명하기 위해 위와 같이 표현하였다.)

    • CPU는 직렬 처리에 최적화된 몇 개의 코어로 구성. 반면, GPU는 병렬 처리용으로 설계되었다. 작고 효율적인 코어로 구성
    • CPU는 순차적인 작업에 강점. GPUCPU보다 많은 코어의 수로 병렬적인 작업에 강점

마무리

최근 대용량 데이터 처리 관련 업무를 하며 GPU를 활용한 병렬 처리를 검토하고 있어서 CPU와 GPU의 간단한 차이에 대해 알아봤습니다. CPU와 GPU는 모두 컴퓨터 시스템에서 중요한 역할을 하며, 각각의 특징과 용도에 따라 다른 작업에 최적화되어 있습니다. CPU는 다양한 일반적인 작업을 처리하는 데 사용되고, GPU는 그래픽 및 대규모 병렬 처리가 필요한 작업에 특화되어 있습니다. 현대 컴퓨팅은 CPU와 GPU를 조합하여 최상의 성능과 효율성을 달성하는 것이 일반적입니다. 이러한 CPU와 GPU의 차이를 알고 소프트웨어를 개발하면 좋을 것 같습니다.

 

반응형
반응형

Intro

안녕하세요. 이번에는 클래스 다이어그램 작성 방법에 대해 이야기하려고 합니다. 클래스 다이어그램은 소프트웨어 개발에서 중요한 시각적 도구로서 코드를 이해하고 설계하는 데 도움이 되는 매우 유용한 도구입니다. 

클래스 다이어그램

클래스 다이어그램(Class Diagram)

  • 시간에 따라 변하지 않는 시스템의 정적인 면을 보여주는 대표적인 UML 구조 다이어그램
  • 시스템의 일부 또는 전체의 구조를 나타낼 수 있다.
  • 의존 관계를 명확히 보게 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 순환고리를 깰 수 있을지 결정할 수 있게 해 준다.

클래스 구성

접근 제어자 리스트

  • Attribute와 Method 앞의 기호가 접근 제어자이다.
접근 제어자 표시 설명
private - 이 클래스에서 생성된 객체만 접근 가능
public + 어떤 클래스의 객체에서든 접근 가능
protected # 이 클래스와 상속 관계에 있는 하위 클래스의 객체들만 접근 가능
pakage ~ 동일 패키지에 있는 클래스의 객체들만 접근 가능

클래스 다이어그램 관계 표현

UML 표기

  1. 일반화 (Generalization)
  • 일반화는 일반적으로 상속 관계를 표시할 때 표기 (Is -A 관계)

Class ParentA(){
	//부모클래스
}
Class ChildB():ParentA
{
	//자식클래스B
}

Class ChildC():ParentA
{
	//자식클래스C
}

2. 실체화(Realization)

  • 실체화는 Interface를 자식 클래스에서 실제로 구현

보통 Interface는 클래스 이름에 I를 붙힘

interface ITest{ //인터페이스
public:
	public void DeviceSearch();
    public void DeviceManager();
    public void OpenDevice();
    public void CloseDevice();
}

public Test1 : ITest//인터페이스를 상속받으면 전부 구현 해야 됨
{
    public override void DeviceSearch()
    {
      Console.WriteLine("DeviceSearch");
    }
    public override void DeviceManager()
    {
      Console.WriteLine("DeviceManager");
    }
    public override void OpenDevice()
    {
      Console.WriteLine("OpenDevice");
    }
    public override void CloseDevice()
    {
      Console.WriteLine("CloseDevice");
    }


}

3. 의존 (Dependency)

  • 의존관계는 클래스 간 참조가 일어남을 말함
  • 메서드 내에서 다른 클래스의 객체를 생성하거나 사용을 말함

public class User
{

  private String name;
  privateint age;
  public String Name
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
public int Age
  {
    get
    {
      return age;
    }
    set
    {
      age= value;
    }
  }

}

public class Board
{
  private String name;
  private int age;
  
  User user = new User();
  user.Name = "박순영";
  user.Age = 19;

}

4. 연관( Association , Directed Association)

  • 클래스들이 개념상 서로 연결되었음을 나타냄. 보통은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일 때 표시
  • 연관 관계의 숫자 표현

– 1 - 1개의 표현

– * - 0 ~ n 개의 표현

– n... m : n부터 m까지 연관관계를 맺음

4.1 일반 연관(Association)

  • 다른 객체의 참조를 가지는 필드를 의미

public class User
{

  private String name;
  private int age;
  private Board board;
  public String Name
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
public int Age
  {
    get
    {
      return age;
    }
    set
    {
      age= value;
    }
  }

}



public class Board
{
  private String name;
  private int age;
  private List<user> users;
  
  public void Open()
  {
    ///
  }

}

4.2 직접 연관 (Directed Association)

  • 직접 연관 관계는 방향성을 갖는데, 방향성으로 참조하는 쪽과 참조당하는 쪽을 구분

public class User
{

  private String name;
  private int age;
  public String Name
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }
public int Age
  {
    get
    {
      return age;
    }
    set
    {
      age= value;
    }
  }

}


public class Board
{
  private String name;
  private int age;
  private List<user> users;
  
  public void Open()
  {
    ///
  }

}

 

5.1 집합 (Aggregation)

  • 집약 관계는 한 객체가 다른 객체를 포함하는 것을 나타냄
  • 부분 객체를 다른 객체와 공유 가능
  • 전체 객체의 라이프타임과 부분 객체의 라이프타임은 독립적

5.2 집합 연관

  • 클래스 다이어그램에서 클래스 간의 관계 중 하나로, 한 클래스의 인스턴스가 다른 클래스의 인스턴스들과 집합 형태의 관계를 가지는 것을 의미
  • 한 클래스가 다른 클래스의 객체들을 소유하거나 포함하는 관계
class CPU
{
    public string Model { get; private set; }

    public CPU(string model)
    {
        Model = model;
    }
}

class MainBoard
{

    public string Model { get; private set; }

    public MainBoard(string model)
    {
        Model = model;
    }



}


// 컴퓨터(Mainboard) 클래스
class Computer
{
    private list<Mainboard> mb;
    private list<CPU> cpu;

    purlic Computer(list<Mainboard> MB, list<CPU> CPU)
  {
      mb = MB;
      cpu = CPU
  }

  
    
}

6.1 합성(Composition)

  • 부분 객체가 전체 객체에 속하는 관계
  • 전체 객체가 사라지면 부분 객체도 사라짐
  • 부분 객체를 다른 객체와 공유 불가
  • 부분 객체의 라이프타임은 전체 객체의 라이프타임에 의존

public class Computer
{
  private Mainboard mb;
  private CPU cpu;
  purlic Computer()
  {
      mb = new MainBoard();
      cpu = new CPU();
  }
}

6.2 복합 연관

  • 클래스 간의 관계 중 하나로, 한 클래스의 인스턴스가 다른 클래스의 인스턴스들과 부분-전체 관계를 가지는 것을 의미
  • 한 클래스의 객체가 다른 클래스의 객체들을 구성하는 관계를 나타냅니다. 이렇게 복합 연관을 가지는 클래스들은 하나의 객체가 여러 개의 다른 객체들을 포함하고 있으며, 이들 객체들은 함께 묶여서 하나의 논리적인 단위를 이룸

마무리

소프트웨어 개발은 협업과 이해를 기반으로 하기 때문에 명확하고 효과적인 클래스 다이어그램 작성은 개발자들 사이의 원활한 소통을 도와줍니다. 이상입니다.

반응형
반응형

Intro


안녕하세요, 오늘은 제가 오레일리의 고성능 파이썬이라는 책을 보다가, 모범적인 개발 절차에 대한 좋은 글을 보게되어서, 공유드리고자 글을 쓰게 되었습니다.

저도 주니어 개발자로서 부족함을 많이 느끼고 있는데요, 이 글에 쓰여져있는 내용을 잘 새겨듣고 실천하면서 실력을 기르려고 합니다.

문서화/ 좋은 구조/ 테스트


이 책에서는 모범적인 작업 절차의 핵심 요소가 문서화/ 좋은 구조/ 테스트라고 했는데요, 각각에 대해서 정리해보겠습니다.

문서화

문서화... 저도 회사에서 일하면서 느끼는 거지만 문서화 만큼 중요하면서 귀찮은 건 없는거 같습니다 ㅋㅋㅋ 하지만 지금이 아닌 나중을 위해서, 문서화는 꼭꼭 필요한 절차라고 생각합니다. 책의 저자는 프로젝트에 대한 설명을 README.md파일이나 docs/폴더에 적으면 좋다고 하는데요, 이 설명에 들어갈 내용은 아래와 같습니다.

  1. 프로젝트 목적
  2. 폴더 내용 (디렉토리 구조 및 용도)
  3. 데이터 출처
  4. 중요한 파일 목록
  5. 프로그램과 파일의 실행 방법
  6. 테스트 실행 방법

또한 코드의 모든 함수, 클래스, 모듈에 docstring을 추가하는 것도 좋다고 합니다. docstring에는 함수가 달성하고자 하는 내용과 예상 출력을 보여주는 간단한 예시를 적으라고 합니다. 저같은 경우는 로직이 복잡하거나 특수한 제약 사항에 의해서 코드가 어색해질 때 docstring을 추가하는데요, 모든 함수, 클래스, 모듈에 docstring을 추가하라니... 벌써부터 머리가 아프네요 ㅋㅋㅋ. 이런 docstring은 우리가 많이 쓰는 numpy가 정말 잘 되어 있는거 같아요.

아래는 PyCharm에서 numpy의 concatenate함수에 대한 docstring을 보여줍니다.

함수의 파라미터의 타입과 역할, 비슷한 함수 뿐만 아니라 함수 설명, 예시까지 정말 완벽한 docstring이라고 생각됩니다. 하지만 현업에서는 이런 걸 다 지키면서 일하기에는 무리가 있어 보이네요 ㅎㅎ

하지만 저도 저자가 말한 것처럼 일하면서 최대한 다른 사람들이 코드를 사용하고, 이해하기 쉽게하기 위해서 문서화에 더 신경을 써야할 거 같아요.

좋은 구조

저자는 프로젝트의 코드 작성 및 관리에 대해서도 여러 팁을 줍니다. 아래에 하나씩 열거해보고 제 생각을 적겠습니다.

  1. 코드는 짧게 만들어야 한다. 그러면 테스트하기도 쉽고, 이해하기도 쉽다.

    • 정말 맞는 말 같아요. 저도 회사에게 사수에게 한 함수는 반드시 하나의 일만 해야된다는 피드백을 자주 받았는데요, 각 함수가 하나의 일만 하도록 하다보니 코드 가독성이 좋아지는 거 같았어요.
  2. 소스 관리를 해라 (== git을 잘 사용해라). commit을 작은 단위로 자주해라

    • git의 중요성에 대해서는 말할 필요가 없는 거 같아요. 뒤에 commit을 작은 단위로 자주하라는 피드백은 공감가는게, 변경사항을 commit하지 않고 개발하다가 나중에 commit하려다 보면, 서로 관계없는 변경사항끼리 엉켜있어서 적절한 commit message를 사용하기 어렵더라고요. commit message는 디버그 및 코드 변경 히스토리를 파악하기 위해서 꼭 필요한 거 같아요!
  3. PEP8 코딩 표준을 지켜라 (feat. black, flake8, pylint, isort ...)

    • PEP8 스타일은 파이썬 프로그래밍에 있어서 기본이죠. 그리고 우리가 만든 코드가 PEP8에 맞춰 작성되었는지 확인해주는 여러 보조 라이브러리들이 있습니다.

    • black: 코드의 identation이 잘 되어있는지, 한 줄의 길이가 길진 않은지 등을 판단하고 적절하게 formatting을 해주는 라이브러리 입니다.

    • flake8, pylint: 코드를 lint한다고 하는데요, 코드에 문법상이나 스타일 상으로 문제가 있는지 등을 알려줍니다. 눈으로 발견하기 어려운 실수를 찾아줘서 좋은 거 같아요.

    • isort: 프로젝트가 커지다 보면 import하는게 많아질 때가 있잖아요? isort는 import를 알파벳순으로, 보기 좋게 formatting해주는 라이브러리 입니다.

    • 위와 같이 도움을 주는 여러 라이브러리가 있지만, 사람에 따라서 이를 사용하는 걸 선호하는 사람도 있고, 아니면 스스로 잘 지키도록 단련?하는게 중요하다고 하는 사람도 있는 거 같아요. 결론은 개취를 존중하자 ㅋㅋㅋ

  4. 운영체제와 분리된 환경을 만들어라

    • 프로젝트에 따라서 필요한 라이브러리나 버전이 다를 수 있죠. 그래서 프로젝트마다 독립된 환경을 만드는게 중요합니다. 가장 간단하고 많이 알려진 방법으로는 Anaconda 또는 pipenv를 통해서 가상환경을 만드는 방법이 있습니다.
    • 요즘 더 핫한 거는 docker를 이용해서 환경을 구성하는 방법같아요. 저도 잘은 모르지만, 위의 방법들 보다 강한? 독립성을 보장해주는 방법인 거 같습니다.
  5. 자동화해라

    • 자동화가 많이 하고 수동 작업을 줄일수록 실수할 여지는 적어진다고 합니다. CI/CD 자동화를 통해서 누구나 실행하고 지원할 수 있는 표준 절차를 만드는 것이 바람직하다고 하네요. 저에게는 아직 어려운 일인거 같아요 ㅜ

테스트

특정 입력에 대해서 코드 작성자가 예상한 출력이 나오는지 확인해보는 것을 테스트라고 합니다. 코드를 실제 서비스에 배포하기 전에, 이상이 없는지 확인하는 것이죠. 파이썬의 경우 unittest라는 내장 모듈을 제공하고, 이에 기반한 pytest도 있습니다. 테스트가 중요한만큼, 기존 코드에 테스트 코드가 없는 경우에는 반드시 추가를 해줘야한다고 합니다. 테스트 코드는 주로 tests/폴더에 작성하고 관리하는게 좋다고하네요. 검증이 필요한 부분부분을 테스트하는 코드를 통해, 최종적으로 프로젝트 전체 흐름을 검사하는 intergration test가 되야한다고 합니다. 테스트에 관해서는 저도 경험이 적어서 전달밖에 못하겠네요 ㅎㅎ.

아무튼 모든 코드가 내가 의도한 대로 작동하는지 확인하기 위해서는 테스트가 반드시 필요하니, 저도 pytest같은 모듈을 통해 테스트 코드를 작성하는 연습을 해봐야겠습니다.

마무리


오늘은 제가 공부하고 있는 책에 나온 모범적 작업 절차에 대해서 정리해봤습니다. 우리 모두 좋은 개발자가 되어봐요! 화이팅!

참고


고성능 파이썬

반응형
반응형

Intro


안녕하세요.
유닛 테스트는 무엇이길래 많은 개발자들이 중요성에 얘기 할까요?

유닛 테스트는 소프트웨어 개발자라면 한 번쯤은 들어 봤을 개념입니다. 많은 개발자들이 중요성은 인지하고 있지만 귀찮고 시간이 걸리기 때문에 안 하는 경우가 많습니다. 제가 이전에 다니던 회사에서도 유닛 테스트에 대한 말이 많았습니다. 왜 굳이 시간 들여서 하냐는 의견과 애당초 버그 없이 만들면 되는 거 아니냐는 의견이 있었습니다. 하지만 유닛 테스트는 분명 귀찮고 시간이 걸리는 것처럼 보이지만 실제로 효율적으로 사용한다면 오히려 개발할 때 생기는 디버깅 시간을 단축시 켬으로써 효율적인 프로그래밍이 가능합니다. 그리고 유닛 테스트는 프로그램 배포 전에 개발자가 검증할 수 있는 최소한의 도구라고 생각합니다. 제 고객이 테스터가 될 수는 없잖아요...

그러면 유닛 테스트에 대해 알아보도록 하겠습니다.

유닛 테스트란?


유닛 테스트는 컴퓨터 프로그래밍에서 소스 코드를 가장 작은 단위(함수 단위)로 나누어 의도된 대로 정확히 동작하는지 검증하는 테스트 메서드입니다.

유닛 테스트의 장점

  1. 디버깅이 쉽다. 유닛 테스트의 목적은 프로그램을 작은 단위로 쪼개여 버그를 빠르게 파악하고, 버그 위치를 재빨리 찾아 빠른 디버깅이 가능합니다. 유닛 테스트를 하는 게 시간이 더 든다고 생각할 수 있겠지만 개발 기간 중 많은 시간을 할애하는 디버깅 시간을 단축시킴으로 여유 있는 프로그래밍이 가능하게 합니다.
  2. 변경이 쉽다. 유닛 테스트 테스트 케이스가 잘 짜여 있으면, 내가 소스코드를 변경했을 때 유닛 테스트를 믿고 언제든지 리팩터링이 가능합니다. 리팩토링 후 해당 변경 내용이 의도대로 작동하는지는 유닛 테스트로 확인이 가능합니다. 또한, 유닛 테스트는 작성한 코드가 개발자의 의도대로 작동하는지 검증의 절차도 있지만, 코드 변경에 의한 사이드 이펙트를 최소화할 수 있습니다.
  3. 통합이 간단하다. 유닛 테스트는 유닛 자체의 불확실성을 제가 해주기 때문에 상향식 테스트 방식에 유용합니다. 프로그램의 각 가분을 검증하고 그 부분을 다시 합쳐 다시 검증하는 통합 테스트에서 더욱 빛을 발휘합니다.
  4. 코드 파악 쉽습니다. 테스트 케이스를 작성하다 보면 제가 만든 코드를 분석하며 어디에 영향이 끼치는지 파악이 가능하고 작성한 코드의 이해가 높아집니다.

훌륭한 단위 테스트란?
F. I. R. S. T

  • Fast : 완성도 높은 프로젝트에서 수천 개의 단위 테스트를 수행하는 것은 드문 일이 아닙니다. 단위 테스트는 실행하는 데 시간이 거의 걸리지 않습니다. 밀리초.
  • Isolated : 독립형 단위 테스트는 독립적으로 실행될 수 있으며, 파일 시스템 또는 데이터베이스와 같은 외부 요인에 종속되지 않습니다.
  • Repeatable : 단위 테스트를 실행하는 것은 해당 결과와 일치해야 합니다. 즉, 실행 사이에 아무것도 변경하지 않으면 항상 동일한 결과를 반환합니다.
  • Self-validating : 테스트는 사람의 개입 없이 통과했는지 여부를 자동으로 검색할 수 있어야 합니다.
  • Timely : 위 테스트는 테스트 중인 코드에 비해 작성하는 데 불균형적으로 긴 시간이 걸리지 않아야 합니다.

마무리


오늘은 유닛 테스트에 대해 알아봤습니다. 개인적으로 유닛 테스트는 정말 주요하다고 생각합니다. 예전에 프로그램을 만들어 외국의 업체에 배포한 경험이 있습니다. 그때 유닛 테스트는 하지 않고 배포했었습니다. 그 당시 1년 차 개발자였고.. 그 당시 회사에서는 코드에 유닛 테스트를 도입하지 않았었습니다. 그때 나름 검증하고, 회사의 다른 PC에서도 검증을 했는데... 그 외국 업체의 PC에서 프로그램이 동작하지 않는다고 했습니다. 알고 보니 전역 변수로 선언한 변수를 초기화 하지 않고 사용 했었는데.. 보통 전역 변수는 선언과 동시에 0으로 초기화 됩니다. 근데 제가 실수로 그 변수를 초기화 하지 않고 0으로 가져다 썼습니다. 그 당시 프로그램에 문제는 없었습니다. 하지만... 모든 PC가 전역 변수를 0으로 초기화 하지 않더라고요... C++ 표준에는 전역변수를 0으로 초기화 하지만 일부 PC의 컴파일러에 따라 전역변수가 0으 초기화 되는걸 보장하지 않는다고 합니다.. 제가 분명 실수를 하고, 우연히 전역변수로 선언한 변수가 제가 사용하려는 0 값과 같이 겹치며 생긴 버그였습니다. 이때 욕 정말 많이 먹었습니다. 그 당시 저는 나름 검증을 했고 디버깅 시 이상이 없었기 때문에 외국업체에 너네 문제인 것 같다고 피드백을 줬는데.. 정말 개망신당했습니다. 하지만 이때 유닛 테스트를 했다면 충분히 걸러질 수 있는 버그였습니다. 그렇기 때문에 유닛 테스트는 배포 전 최소한의 검증 도구라고 생각합니다.
그럼 이상으로 포스팅 마치겠습니다. 감사합니다.

반응형
반응형

Intro


이번 포스팅에서는 개발자들이 개발한 코드를 문서화할 때 사용하는 Doxygen이란 걸 소개하도록 하겠습니다.
오픈소스 기반 프로젝트를 개발하거나 SDK 별도로 받아 개발할 때 레퍼런스(개발자 문서)를 참조해서 개발해본 경험이 있으실 겁니다.
Doxygen은 개발자들이 개발한 코드에 주석을 작성하면 주석이 달린 코드를 읽어 자동으로 문서를 만들어내는 소프트웨어 레퍼런스 문서 생성기입니다. 저 같은 경우 주로 SDK를 외부에 배포할 때 자주 사용하는데 정말 편리하고 좋습니다. 이번 포스팅에서 doxgen에 관한 전반적인 소개와 Doxygen 다운로드, 설치, 사용법, 주석 방법, 실제 배포할 때 html 파일을 chm파일로 묶어서 배포하는 것 까지 포스팅하겠습니다. 포스팅 내용이 길어질 거 같아서 2번에 나눠서 포스팅하도록 하겠습니다.

Doxygen


Doxygen이란?

주석이 달린 코드를 읽어내 문서를 만드는 소프트웨어 레퍼런스 문서 생성기입니다. 문서의 결과는 보통 HTML로 나오거나, 설정하는 환경에 따라 Word 파일, PDF 파일로 변환하여 만들 수 있습니다. 코드 내의 정해진 규칙에 짜여진 주석으로부터 정보를 읽어오며, 규칙만 지키면 모든 언어의 정보를 읽어 올 수 있습니다.

왜 Doxygen을 사용하나?

Doxygen 양식에 맞는 정해진 주석을 공통적으로 사용하면 다른 사람이 소스코드를 이해하기 편리합니다. 또한 보통 소스 코드 작성 후 별도로 문서를 작성하는데 매우 번거롭습니다. 하지만 Doxygen을 사용하면 문서와 코드의 동기화가 가능하여 빠르고 효율적으로 문서 관리가 가능합니다.

Doxygen 다운로드 및 설치 방법

  1. 다운로드. Windows 버전을 다운로드 해줍니다.
    Doxygen다운
  2. 설치. Next를 눌러주며 설치해줍니다.




Doxygen 사용법

실행 파일 클릭(Doxywizard.exe)
Project 설정

  1. 프로젝트 루트 폴더 지정
  2. 프로젝트 이름 설정
  3. 프로젝트 개요 설정
  4. 프로젝트 버전 입력
  5. 문서 로고 선택
  6. 소스 코드 파일 위치 설정
  7. 하위 폴더의 모든 코드를 문서화할지 여부
  8. Doxygen 문서 생성 폴더
  9. 다음 step

Mode 설정

  1. 문서 or 문서+소스코드 선택
  2. 프로그래밍 언어 선택
  3. 다음 step

Output설정

  1. 포맷 설정
  2. 생성 파일 설정
  3. 다음 setp

Diagrams 설정

  1. Diagram 설정
  2. 다음 step

Run 설정

  1. 문서 생성
  2. 설정 보기
  3. HTML 파일 미리 보기

마무리


이번 포스팅은 내용이 길어져서 .. 2번으로 나누어 포스팅 하겠습니다.이상으로 포스팅을 마치겠습니다. 다음 포스팅에서는 실제 배포할 때 html 파일을 chm파일로 묶어서 배포하는 것 까지 포스팅하겠습니다.

반응형
반응형

Intro


오늘은 제가 취업 준비에 활용한 채용 관련 사이트를 소개하려고 합니다.

저의 준비 방법을 최고라고 생각하지는 않지만, 정보 공유 차원에서 올리는 것이니 참고만 바랄게요ㅎ

저는 아래 사이트들에서 많은 도움을 받았던 거 같아요

- 구글 채용 정보 서비스

- 원티드

- 그 외. 프로그래머스, 백준, SW expert academy

하나씩 소개해 드리겠습니다!

구글 채용 정보 서비스


웹 사이트는 아니지만, 구글 검색창에 원하는 직무를 검색하면, 여러 채용 사이트에 올라온 공고를 한 눈에 확인할 수 있어요!

아래는 "머신러닝 채용"을 검색한 결과 입니다.

채용정보 더보기를 클릭하면, 더 구체적인 정보를 확인할 수 있습니다.

프로그래머스, 원티드 등 채용 사이트 뿐만 아니라, 회사 자체 홈페이지의 공고를 함께 볼 수 있습니다.

다만 잡플래닛, 사람인 등 대형(?) 취업 정보 사이트의 공고는 올라오지 않는 거 같아요. 저는 여기에서 원하는 공고를 거의 다 찾을 수 있었는데, 부족하다고 생각하시는 분은 잡플래닛과 사람인 등을 함께 사용하시는게 좋겠네요.

제가 구글 채용 정보 서비스를 추천하는 다른 이유는, 사이트 하단의 신규 채용 정보 알림 기능입니다!

취업 준비하면서 가장 귀찮아도 필요했던 일이 새로운 공고가 올라온게 없는지 확인하는 거였는데요, 이 기능을 활성화 시키면, 제가 찾는 조건과 키워드에 맞는 새로운 공고가 올라왔을 때 연결된 이메일로 해당 공고 정보를 보내줍니다.

저는 이 기능 덕분에 원하는 공고를 쉽게 찾을 수 있었던 거 같아요! 안 써보신 분은 한 번 써보세요 ㅎㅎㅎ

원티드

원티드는 제가 머신러닝 관련 공고를 많이 찾다보니까, 자주 눈에 보여서 사용하게된 사이트입니다.

제가 원티드를 추천하는 이유는 2가지 입니다.

  1. 쉬운 (자소서를 안써도 되는) 공고 지원
  2. 채용 담당자의 빠른 피드백

조금 더 자세하게 말씀드릴게요.

쉬운 (자소서를 안써도 되는) 공고 지원

원티드는 처음에 조금 시간만 들이면, 그 이후에 공고 지원이 아주 쉽더라고요.

처음에 시간을 들여야 하는 일은, 1) 이력서2) 포트폴리오를 만드는 겁니다. 정해진 양식없이 자기의 능력을 어필할 수 있도록 (자신 있는 성과를 초반에 배치) 만드는게 좋을 거 같아요. 이력서와 포트폴리오 작성하는 방법은 이 글에서 다루지 않겠습니다.

이력서와 포트폴리오를 만든 다음에는 원하는 직무를 찾고, 미리 작성한 이력서와 포트폴리오를 첨부하고, 지원 버튼을 누릅니다. 지원 버튼을 누르고 나면, 지원한 공고와 비슷한 여러 공고가 보여집니다. 여기서 맘에 드는 공고를 선택하고, 지원하기 버튼을 한 번 더 누르면, 한 번에 여러 회사를 지원할 수 있게 됩니다!

회사마다 자소서의 질문 항목도 달라서 그동안 자소서 쓰느라 머리아팠는데, 원티드를 통해 지원하니 너무 편했어요.

같은 회사의 같은 공고라도, 회사 홈페이지를 통해 지원하면 자소서를 쓰고, 원티드를 통해 지원하면 자소서를 안써도 되는 경우가 있더라고요!

채용 담당자의 빠른 피드백

위 사진을 보면, 원티드에서 제가 지원한 공고의 평균 응답일과 응답 비율 정보를 제공해줘요. 이렇다 보니, 기업의 채용 담당자분들이 이 수치를 관리하기 위해서, 다른 경로를 통해 지원했을 때보다 비교적 빠르게 응답해주는 느낌을 받았습니다.

저만의 경우일 수도 있지만, 5개의 기업에 지원하고, 4개의 기업에서 3일 이내에 피드백이 왔습니다.

4개 중 1개 기업은 자소서 작성을 부탁하고, 나머지 3개 기업은 바로 코딩 테스트나 과제 테스트를 진행했습니다.

코딩 테스트와 과제 테스트는 개인이 얼마나 준비했느냐에 달린 것이기 때문에, 여기에 대해서는 팁이라고 할 수 있는게 없지만, 저는 원티드를 통해 이 과정까지 도달하는 시간을 많이 절약할 수 있었다고 생각합니다.

그 외


프로그래머스

  • 개발 관련 직군 채용 공고와, 코딩 테스트를 대비할 수 있는 사이트에요! 많은 회사들이 프로그래머스를 통해 코딩 테스트를 진행하므로, UI에 익숙해질 필요가 있으며, 다른 코딩 테스트 대비 사이트에는 없는 SQL문제도 있기 때문에, 머신 러닝이나, 데이터 분석 직무를 준비하시는 분들은 프로그래머스의 SQL문제 꼭 풀어보는걸 추천 드려요!

백준

  • 코딩 테스트 공부의 바이블이라고 생각합니다. 수많은 알고리즘 문제들이 종류별, 난이도별, 테마별로 정리되어있습니다. 모르는 문제는 구글에 검색하면 답을 찾을 수 있을 정도로 많은 사람들이 사용하고 있습니다.

SW expert academy

  • 삼성전자의 SW 역량 테스트를 준비하시는 분들은 꼭 봐야할 사이트 입니다. 문제의 품질?이나 테스트 케이스가 백준만큼 정교하지는 않지만, 지난 기출 문제와 함께 모의 문제까지 풀어보는 걸 추천드립니다.

마무리


오늘은 제가 취업 준비하는데 참고했던 사이트들을 정리해봤습니다. 더 좋고 효율적인 방법 알고계신 분은, 댓글을 통해 공유해주시면 감사하겠습니다.

좋은 하루 보내세요!

반응형
반응형

Intro


안녕하세요. 이번 시간에는 C++에서 함수를 호출 방법에 대해 알아보도록 하겠습니다. 지난 시간에 STL 람다에 대해 스터디를 할 때 캡처에서 Call by value(값에 의한 호출)와 Call by reference(참조에 의한 호출)의 개념이 나와서 정리해보는 시간에 대해 갖겠습니다.

Call by value(값에 의한 호출) vs Call by reference(참조에 의한 호출)


함소를 호출하는 방법에는 2가지 방법이 있습니다. Call by value(값에 의한 호출)과 Call by reference(참주에 의한 호출)입니다.

Call by value(값에 의한 호출) : Call by value는 함수에 원본 값을 그대로 전달하여 복사해서 사용하는 방식입니다. 원본을 그대로 복사하여 사용하기 때문에 원본에 영향을 미치지가 않습니다. 함수에서 원본에 대해 아무리 무언가를 바꿔도 그 함수 내에서만 영향을 끼치고, 함수 밖에서는 전혀 영향을 끼치지 못합니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>  
void func(int n)  
{  
    n = 20;  
    std::cout << "함수에서 호출" << n << std::endl;  
}  

int main(void)  
{  
    int nNum = 0;  
    func(nNum);  
    std::cout <<"Main함수 호출"<< nNum << std::endl;  
    return 0;  
}  

결과

결과를 보면 func함수의 매개 변수로 원본값인 nNum을 전달하여 nNum에 숫자를 대입했습니다. 대입 후 결과를 봤을 때 nNum의 값은 func함수에서만 변화하였고, Main함수에서는 초기 초기화한 그대로 0이 출력이 됩니다. 함수 안에 n = 20; 은 함수가 종료되며 자동으로 소멸되기 때문입니다. 그래서 실제 함수에서 변경되는 값을 받고 싶으면 함수에 return값을 주거나 Call by reference를 통해 주소를 참조하면 됩니다.

return 타입을 통해 값 변경

#include <iostream>
int func()
{
    int n = 20;
    std::cout << "func함수 호출" << n << std::endl;
    return n;
}

int main(void)
{
    int nNum = 0;
    nNum = func();
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

Call by reference(참조에 의한 호출) : Call by reference는 주소에 의한 호출로 주소를 참조하여 호출하는 방식입니다. 원본의 주소값을 전달하기 때문에 원본을 변경할 수 있습니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>
void func(int *n)
{
    *n = 20;
    std::cout << "func함수 호출" << *n << std::endl;
    std::cout << "func함수 호출" << n << std::endl;
}

int main(void)
{
    int nNum = 0;
    func(&nNum);
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

함수에 주소를 전달하여 값을 변경했기 때문에 nNum의 값은 함수가 종료가 되어도 메모리 상에 있는 20이라는 값을 유지 합니다. 이유는 원본(nNum)에 주소 값을 통해 접근했기 때문입니다. 위의 결과에 0000009C08FCF710이 원본이 가지고 있는 주소 있니다. 저 주소는 프로그램이 끝날 때까지 가지고 있는 주소입니다.

마무리


오늘은 Call by value vs Call by reference에 대한 포스팅을 해 봤습니다. Call by value vs Call by reference는 C++에서 가장 기본이 되는 개념중 하나입니다. 함수를 호출할 때 매개변수로 전달받은 값이 원본에 영향을 끼치는지 주의 깊게 살펴봐야 합니다.

이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형
반응형

Intro


이번에 MySQL문법을 따르는, table에서 정보를 검색하는 query를 정리하겠습니다.

최근 코딩테스트에서 SQL문제가 나오는 경우가 많은데, 아래 명령어들을 참고해서 문제를 해결하는 연습을 해보면 좋을거 같습니다.

추천 사이트: 프로그래머스

기초 query (제 기준ㅎㅎ)


SELECT

  1. 기본 형식
    SELECT col_name
    FROM table_name;
  2. 중복 제거 검색
    SELECT DISTINCT col_name
  3. 개수 검색 ##합: SUM, 평균: AVG
    SELECT COUNT(col_name)
  4. UNIQUE값 개수 검색
    SELECT COUNT(DISTINCT col_name)
  5. 검색 결과 중 n개만 보기
    Query 마지막에 LIMIT n;
  6. NULL값 채우기: IFNULL( , )
    SELECT IFNULL(col_name, 0)

 

 

ORDER BY

  1. 기본 형식
    SELECT col_name, column1, column2
    FROM table_name
    ORDER BY
        column1 [ASC|DESC], ##1순위 정렬
        column2 [ASC|DESC], ##2순위 정렬
        ...;
  2. 실행 순서
    FROM -> SELECT -> ORDER BY
  3. FIELD: 정렬할 때 숫자나, 알파벳 순으로 정렬하지 않고, 정렬 순서를 지정하고 싶을 때 사용
    ORDER BY FILED ([col_name], priority1, priority2, …, );

WHERE

  1. 기본 형식
    SELECT lastname, firstname
    FROM employees
    WHERE condition1 (AND/OR condition2 AND/OR condition3 ….)
    ORDER BY firstname;
    A. AND가 OR보다 우선 순위임, OR먼저 하려면 괄호를 사용해야함
  2. 실행 순서
    FROM -> WHERE -> SELECT -> ORDER BY
  3. BETWEEN - 범위 조건에 사용
    WHERE officeCode BETWEEN 1 AND 3
  4. LIKE - %, _을 이용해서 패턴 매칭, %은 문자열 길이 상관 X, _은 1글자만 가능
    WHERE lastName LIKE ‘%son’ ## lastName이 son으로 끝나는 사람 조회
  5. IN – membership 조건
    WHERE officeCode IN (1, 2, 3)
  6. IS (NOT) NULL – NULL 있(없)는지 확인
    WHERE officeCode IS (NOT) NULL
  7. CAST- 형 변환에 사용
    CAST('2003-01-01' AS DATE) ##string to date variable

MIN(), MAX()

  1. MIN
    SELECT MIN(Price) AS SmallestPrice
    FROM Products;
  2. MAX
    SELECT MAX(Price) AS LargestPrice
    FROM Products;

Aliases (AS)

  1. 이름을 바꿀 때 사용, 이때, 바꿀 이름에 띄어쓰기가 있으면 “”이나 []로 감싸야함

고오급 query (제 기준ㅎㅎ)


INDEX

  1. 역할
    A. DB를 full-scan하지 않고 자주 필요한 정보를 빠르게 찾기 위해서 위치를 저장해 놓음
  2. 사용 예시: CREATE INDEX index_category ON book_store(category)
    A. 테이블 book-store의 컬럼 category에 대해서 인덱스 index_category생성
    B. 이후 SELECT * FROM book_store WHERE category = 'java'할 때 full-scan없이 탐색 가능 (category가 ‘java’인 instance에 id를 통해 바로 접근 가능)

JOIN

  1. 역할
    A. 공통 컬럼을 기준으로 2개 이상의 테이블의 instance (컬럼까지)를 합치는 연산
  2. 사용 예시
    SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
    FROM Orders
    INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
  3. INNER JOIN
    A. 대상 테이블들에 공통된 값을 가진 instance들을 합침
    B. 3개 이상의 테이블에 대해서 join을 할 때는, 계산 효율성을 따져서 하나씩 join
  4. LEFT (RIGHT) JOIN
    A. 기준 테이블의 모든 instance를 유지한 채로, 매칭되는 값이 있는 다른 테이블의 값을 가져오는 JOIN, 매칭되지 않은 instance의 다른 테이블 컬럼 값은 NULL이 된다.
  5. FULL OUTER JOIN
    A. JOIN에 참여하는 모든 테이블의 instance를 합침, 결과가 매우 커질 수 있음
    B. 최소 크기는 JOIN에 참여하는 테이블 중 가장 큰 테이블, 최대는 모든 테이블의 합
  6. SELF JOIN
    A. 자기 자신과 하는 JOIN, JOIN을 쓰지 않음
    B. 기본 형태
        SELECT column_name(s)
        FROM table1 T1, table1 T2 ## 같은 테이블에 대한 다른 aliases
        WHERE condition;
    C. 예시
    SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
    FROM Customers A, Customers B
    WHERE A.CustomerID <> B.CustomerID AND A.City = B.City
    ORDER BY A.City;

UNION

  1. 여러 개의 SELECT문으로부터 나온 결과의 합집합을 보여주는 명령어 (행 방향 CONCAT)
  2. 단, 두 SELECT문의 컬럼 순서가 달라도 무조건 붙여서 보여주기 때문에 주의해야함
  3. 기본 예시
    SELECT City, Country FROM Customers
    WHERE Country='Germany'
    UNION ## UNION ALL로 하면 중복 제거 없이 보여줌
    SELECT City, Country FROM Suppliers
    WHERE Country='Germany'
    ORDER BY City;
  4. UNION하는 두 결과를 구분하고 싶을 때
    SELECT 'Customer' AS Type, ContactName, City, Country
    FROM Customers
    UNION
    SELECT 'Supplier', ContactName, City, Country
    FROM Suppliers;

DATE_FORMAT

  1. 날짜를 지정한 형식으로 출력
  2. 예시
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE
    FROM DUAL

IF

  1. IF(조건, ‘참인 경우 출력’, ‘거짓인 경우 출력’)
  2. 예시
    SELECT user.seq, IF(user.seq <= 3, 'A', IF(user.seq <=6, 'B', 'C')) AS if_result
    FROM user
  3. Case문 변환
    SELECT user.seq,
    CASE
    WHEN (user.seq <= 3) THEN 'A'
    WHEN (user.seq BETWEEN 4 AND 6) THEN 'B'
    ELSE 'C'
  4. END AS case_result
    FROM user

GROUP BY

  1. The GROUP BY statement is often used with aggregate functions (COUNT, MAX, MIN, SUM, AVG) to group the result-set by one or more columns.
  2. 예시 (ShipperName별 주문 수를 확인하기 위한 query)
    SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders
    FROM Orders
    LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
    GROUP BY ShipperName;

HAVING

  1. The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions. -> aggregated function의 결과에 조건을 명시할 때 사용
  2. 예시
    SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
    FROM Orders
    INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
    WHERE LastName = 'Davolio' OR LastName = 'Fuller'
    GROUP BY LastName
    HAVING COUNT(Orders.OrderID) > 25;

ANY, ALL

  1. WHERE, HAVING절과 함께 사용
  2. ANY
    A. Subquery의 row 중 조건을 만족하는 row가 1개 이상이면 true
    B. 예제
    SELECT ProductName
    FROM Products
    WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
  3. SELECT DISTINCT(ProductName)
    FROM Products
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID
    WHERE OrderDetails.Quantity = 10;
  4. ALL
    A. Subquery의 모든 row가 조건을 만족하면 true

WITH (CTE, Common Table Expressions)

  1. Single statement의 범위 안에서 존재하는 임시 결과 set
  2. CTE사용을 위해선 WITH 명령어를 함께 사용, ‘,’로 구분해서 세부 내용 채우기
    A. 기본 형태
    WITH [RECURSIVE]
    cte_name [(col_name [, col_name] ...)] AS (subquery)
    [, cte_name [(col_name [, col_name] ...)] AS (subquery)]
  3. i. Recursive는 여러 cte중 하나라도 recursive인게 (cte가 자기 자신 참고) 있으면 명시해야함
    B. 예시
    WITH
    cte1 AS (SELECT a, b FROM table1),
    cte2 AS (SELECT c, d FROM table2)
    SELECT b, d FROM cte1 JOIN cte2
    WHERE cte1.a = cte2.c;
    cte_name [(col_name [, col_name] ...)] AS (subquery)
    i. 각 CTE (cte1, cte2)는 ; 이전의 어디에서나 reference될 수
  4. RECURSIVE CTE
    A. 예시
    WITH RECURSIVE cte (n) AS (
    SELECT 1
    UNION ALL # 행방향 concat
    SELECT n + 1 FROM cte WHERE n < 5
    )
    SELECT * FROM cte;

마무리


다음에는 본격적인, TABLE에서 정보를 추출하기 위한 Query에 대해서 정리하겠습니다!

References

w3school
carami님 블로그

반응형
반응형

Intro


안녕하세요, 이번에 MySQL을 공부할 일이 생겨서, 정리한 내용 공유할 겸 글을 써보겠습니다.

명령어는 검은색, 변수 이름은 파란색으로 표시했습니다.

DB 및 TABLE 조회


  1. CREATE DATABASE database-name; - DATABASE 생성
  2. SHOW DATABASES; - 생성되어 있는 DATABASE 조회
  3. SELECT DATABASE(); - 현재 사용중인 DATABASE 확인
  4. USE database-name; - 사용할 DATABASE 선택
  5. SHOW TABLES; - 현재 DATABASE의 TABLE확인
  6. DESC table-name; - 특정 TABLE의 scheme 확인

TABLE 관리


TABLE 생성

  1. CREATE TABLE IF NOT EXISTS table-name (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    str1 VARCHAR(20),  ## 20자리 가변 문자열 (메모리 효율 good, 속도 bad)
    str2 CHAR(1),         ## 1자리 고정 문자열 (메모리 효율 bad, 속도 good)
    int1 INT(5),            ## 5자리 정수
    date1 DATE);          ## yyyy-mm-dd
    A. 그 외 자료형: BOOL, DECIMAL, FLOAT, REAL, DOUBLE 등
    B. 정확한 소수점 저장을 위해서는 DECIMAL사용 (고정소수점)
  2. MySQL constraints 종류
    A. NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT
  3. 다른 테이블 값 복사
    CREATE TABLE IF NOT EXISTS new-table-name
    AS SELECT * FROM table-name;

TABLE 삭제

  1. DROP TABLE IF EXIST table-name;

TABLE 수정

  1. ALTER TABLE IF EXIST table-name [수정 내용];

Instance 추가

  1. 모든 변수에 대해서 추가
    INSERT INTO table-name VALUES (NULL, "apple", "melon",100, '2012-04-14');
  2. 특정 변수에 대해서만 추가 (나머지는 null됨)
    INSERT INTO table-name ('id','str1') VALUES (NULL, "apple");
  3. 여러 개 추가
    INSERT INTO table-name VALUES ("apple", "melon",100, '2012-04-14'), ("car", "cat",100, '2012-04-14'), ("ben", "chi",100, '2012-04-14');

Instance 삭제

  1. DELETE FROM customers   ##data를 삭제한 table 선택
    WHERE country = 'France' ##삭제할 data의 조건 명시, 안하면 모두 삭제
    ORDER BY creditLimit       ##삭제 대상 instance를 creditLimit으로 정렬
    LIMIT 5;                         ##creditLimit이 가장 낮은 5개의 instance 삭제

Instance 수정

A. UPDATE table-name
SET [수정 사항]
WHERE [수정 대상];

마무리


사실 이것만 보고는 감을 익히기 어려울 겁니다. 이를 참고해서 MySQL문제를 풀어보시는게 좋을 거 같습니다.

다음에는 본격적인, TABLE에서 정보를 추출하기 위한 Query에 대해서 정리하겠습니다!

References

w3school

반응형

+ Recent posts