2025년도 수능시험지구 행정구역 교육지원청 연락처

2025년도 수능 시험지구별 행정구역 교육지원청과 연락처를 정리하였습니다.수능 시험지구별 관할 행정구역, 교육지원청, 그리고 각 지원청의 연락처입니다.

2025년도 서울시 시험지구별 관할 행정구역 정보

시험지구 관할 행정구역 교육지원청 전화
동부 동대문구, 중랑구 동부교육지원청 02-2210-1244
서부 마포구, 서대문구, 은평구 서부교육지원청 02-390-5544
남부 구로구, 금천구, 영등포구 남부교육지원청 02-2165-0257
북부 노원구, 도봉구 북부교육지원청 02-3499-6844
중부 용산구, 종로구, 중구 중부교육지원청 02-708-6536
강동송파 강동구, 송파구 강동송파교육지원청 02-3434-4334
강서양천 강서구, 양천구 강서양천교육지원청 02-2600-0841
강남서초 강남구, 서초구 강남서초교육지원청 02-3015-3334
동작관악 동작구, 관악구 동작관악교육지원청 02-810-8343
성동광진 성동구, 광진구 성동광진교육지원청 02-2286-3634
성북강북 강북구, 성북구 성북강북교육지원청 02-944-9332

출처: https://www.sen.go.kr/user/bbs/BD_selectBbs.do?q_bbsSn=1069&q_bbsDocNo=20240703105221923

리액트 SSR과 CSR 컴포넌트 동시에 한 화면에 표출하기

리액트 SSR과 CSR 컴포넌트 동시에 한 화면에 표출하는 예제를 만들어 봅니다.

page.js

import React from "react";

async function SsrComponent() {
  // Fetch data on the server side
  const res = await fetch("https://66cc88b9a4dd3c8a71b7f996.mockapi.io/users", {
    cache: "no-store", // Ensure the data is fetched freshly on each request
  });
  const data = await res.json();

  return (
    <div>
      <h2>SSR Component</h2>
      <ul>
        {data.map((user) => (
          <li key={user.id}>
            {user.id} | {user.name}
          </li>
        ))}
      </ul>
    </div>
  );
}

export default SsrComponent;

CsrComponent.js

"use client";

import React, { useEffect, useState } from "react";

function CsrComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    // Fetch data on the client side after the component mounts
    fetch("https://66cc88b9a4dd3c8a71b7f996.mockapi.io/users")
      .then((res) => res.json())
      .then((data) => setData(data));
  }, []);

  if (!data) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h2>CSR Component</h2>
      <ul>
        {data.map((user) => (
          <li key={user.id}>
            {user.id} | {user.name}
          </li>
        ))}
      </ul>
    </div>
  );
}

export default CsrComponent;

SsrComponent.js

import React from "react";

async function SsrComponent() {
  // Fetch data on the server side
  const res = await fetch("https://66cc88b9a4dd3c8a71b7f996.mockapi.io/users", {
    cache: "no-store", // Ensure the data is fetched freshly on each request
  });
  const data = await res.json();

  return (
    <div>
      <h2>SSR Component</h2>
      <ul>
        {data.map((user) => (
          <li key={user.id}>
            {user.id} | {user.name}
          </li>
        ))}
      </ul>
    </div>
  );
}

export default SsrComponent;

How to install redmine with sqite3 on Mac

맥북에 레드마인을 설치하는 방법을 정리하였습니다. 데이터베이스는 Sqlite3를 사용하는 것으로 가정하고 방법을 나열하였습니다. 홈브루를 사용하여 먼저 루비를 설치하고, sqlite를 설치한 후 레드마인인 다운로드하여 설치합니다. How to install Redmine with SQLite3 on a Mac with an M3 chip

1. Install Homebrew (if not installed)

Homebrew is a package manager for macOS that simplifies the installation of software.

Open Terminal and run:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

2. Install Ruby

Redmine requires Ruby. You can use rbenv to manage Ruby versions easily.

Install rbenv and ruby-build using Homebrew:

brew install rbenv ruby-build

Initialize rbenv in your shell:

rbenv init

Install a compatible version of Ruby (Redmine 5.x requires Ruby 2.7+):

rbenv install 3.0.0
rbenv global 3.0.0

Verify the Ruby installation:

ruby -v

3. Install SQLite3

SQLite3 is usually pre-installed on macOS, but if not, you can install it via Homebrew:

brew install sqlite3

4. Install Bundler

Bundler is a dependency manager for Ruby projects.

Install it with:

gem install bundler

5. Download and Configure Redmine

Download Redmine from the official website or using git:

git clone https://github.com/redmine/redmine.git
cd redmine

Check out a stable branch, e.g., 5.0-stable:

git checkout 5.0-stable

6. Configure Redmine to Use SQLite3

Copy the example configuration file:

cp config/database.yml.example config/database.yml

Edit the config/database.yml file to use SQLite3:

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

7. Install Dependencies

Install the required gems using Bundler:

bundle install --without development test

8. Generate Secret Token

Redmine requires a secret token for session management. Generate it using:

bundle exec rake generate_secret_token

9. Set Up the Database

Create the database structure:

RAILS_ENV=production bundle exec rake db:migrate

10. Start the Redmine Server

You can now start Redmine using the built-in WEBrick server:

bundle exec rails server -e production

By default, the server will run on http://localhost:3000.

11. Access Redmine

Open a web browser and go to http://localhost:3000. You should see the Redmine welcome page.

12. Optional: Running Redmine as a Service

For production environments, consider running Redmine with a more robust web server like Puma or Passenger and setting up a reverse proxy with Nginx or Apache.

Troubleshooting

  • If you run into issues with permissions, ensure that the Redmine directory and its contents are accessible by the user running the server.
  • If there are issues with gems, running bundle install again or clearing the gem cache might help.

This guide assumes a fresh setup; adjust steps if you're integrating into an existing environment.

타입스크립트(TypeScript)와 자바스크립트(JavaScript) 문법적 차이 7가지

타입스크립트(TypeScript)와 자바스크립트(JavaScript) 문법적 차이 7가지

통상 타입스크립트는 자바스크립트보다 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있게 해줍니다. 타입을 명시하고, 인터페이스를 정의하며, 코드 작성 시점에서 오류를 발견할 수 있어, 대규모 애플리케이션 개발에 유리합니다.

1. 타입 시스템

JavaScript: 자바스크립트는 동적 타이핑(dynamic typing)을 사용합니다. 이는 변수의 타입을 명시적으로 지정하지 않으며, 값에 따라 타입이 자동으로 할당됩니다.

let message = "Hello, world!";
message = 42;  // 가능: string에서 number로 타입 변경

TypeScript: 타입스크립트는 정적 타이핑(static typing)을 지원하며, 변수의 타입을 명시적으로 지정할 수 있습니다. 타입이 지정된 변수에는 해당 타입의 값만 할당할 수 있습니다.

let message: string = "Hello, world!";
message = 42;  // 오류: number 타입을 string 타입 변수에 할당할 수 없음

2. 인터페이스와 타입

JavaScript: 자바스크립트는 인터페이스나 타입을 정의하는 기능이 없습니다. 객체의 구조를 지정할 수 있는 방법은 없습니다.

TypeScript: 타입스크립트는 interfacetype 키워드를 통해 객체의 구조를 정의하고, 그 구조에 맞는 객체만 사용하도록 강제할 수 있습니다.

interface User {
  name: string;
  age: number;
}

let user: User = {
  name: "John",
  age: 30
};

3. 명시적 타입 선언

JavaScript: 변수 선언 시 타입을 명시하지 않으며, 할당되는 값에 따라 타입이 동적으로 결정됩니다.

let count = 10; // count는 number로 추론됨

TypeScript: 변수 선언 시 타입을 명시적으로 선언할 수 있으며, 타입스크립트는 타입 일관성을 유지하도록 강제합니다.

let count: number = 10;

4. 함수 매개변수 및 반환 타입

JavaScript: 함수의 매개변수와 반환 타입을 지정하지 않으며, 함수 호출 시 전달되는 인자의 타입도 제한이 없습니다.

function add(a, b) {
  return a + b;
}

TypeScript: 함수의 매개변수와 반환 타입을 명시적으로 지정할 수 있습니다. 이로 인해 함수 사용 시 타입 안전성을 확보할 수 있습니다.

function add(a: number, b: number): number {
  return a + b;
}

5. 제네릭(Generics)

JavaScript: 자바스크립트는 제네릭을 지원하지 않으며, 모든 함수와 클래스는 특정 타입에 대해 작동하도록 고정됩니다.

TypeScript: 타입스크립트는 제네릭을 통해 함수나 클래스가 다양한 타입에서 동작할 수 있도록 합니다.

function identity<T>(arg: T): T {
  return arg;
}

let output = identity<string>("Hello");  // 타입이 string으로 지정된 제네릭 함수

6. 접근 제어자(Access Modifiers)

JavaScript: 자바스크립트에는 public, private, protected와 같은 접근 제어자가 없습니다. 모든 프로퍼티와 메서드는 기본적으로 public입니다.

TypeScript: 타입스크립트는 클래스의 멤버에 대해 접근 제어자를 지원합니다. public, private, protected를 사용하여 클래스 멤버의 접근 범위를 제어할 수 있습니다.

class Person {
  private name: string;

  constructor(name: string) {
    this.name = name;
  }

  public getName(): string {
    return this.name;
  }
}

7. 타입 추론

JavaScript: 자바스크립트에서는 타입 추론이 발생하지 않으며, 모든 변수의 타입은 동적으로 결정됩니다.

TypeScript: 타입스크립트는 타입 추론을 통해 변수, 함수 반환값 등의 타입을 자동으로 추론합니다. 따라서 모든 타입을 명시적으로 선언하지 않아도 됩니다.

let message = "Hello, TypeScript!";  // 타입스크립트가 자동으로 string 타입으로 추론

자바스크립트 리액트 입문 가이드

자바스트립트 언어를 가지고 웹 앱을 만들수 있는 리액트를 입문하기 위해 필요한 지식과 공부 가이드라인을 적어봤습니다.

1. 리액트 입문을 위한 사전 지식

리액트에 입문하기 전에 반드시 익혀야 할 기초적인 웹 개발 지식들이 있습니다. 리액트는 JavaScript를 기반으로 하기 때문에, 이를 잘 이해하는 것이 매우 중요합니다. 또한, 리액트의 최신 문법들은 ES6+ 버전을 활용하고 있어 이에 대한 이해도 필수적입니다.

JavaScript 기초

리액트는 JavaScript 라이브러리이므로 JavaScript의 기본 문법과 개념에 대한 이해가 필요합니다. 변수 선언, 함수, 조건문, 반복문, 배열, 객체와 같은 기본 문법은 물론, 이벤트 처리와 비동기 프로그래밍(예: async, await) 등에 대해서도 알아두는 것이 좋습니다.

ES6+ 문법

ES6 이후의 JavaScript 문법은 리액트에서 자주 사용되므로, 다음과 같은 ES6+ 문법을 공부해야 합니다:

  • letconst
  • 화살표 함수
  • 템플릿 리터럴
  • 디스트럭처링 할당(Destructuring Assignment)
  • 스프레드 연산자(Spread Operator)
  • 모듈(Import, Export)

HTML과 CSS 기본 이해

리액트 컴포넌트는 HTML과 유사한 JSX 문법을 사용하여 UI를 구성합니다. 따라서 HTML 태그와 CSS 스타일링에 대한 기본적인 이해가 필요합니다. 특히, HTML의 DOM 구조와 CSS 선택자에 대한 이해는 리액트에서 스타일링을 다룰 때 도움이 됩니다.


2. 리액트의 핵심 개념과 구조

리액트의 주요 개념과 구조에 대한 이해는 리액트를 제대로 활용하기 위한 중요한 첫걸음입니다. 이 페이지에서는 리액트의 핵심 개념인 컴포넌트, JSX 문법, 상태 관리에 대해 다룹니다.

컴포넌트(Component)

리액트의 기본 단위는 컴포넌트입니다. 컴포넌트는 재사용 가능한 UI 요소를 정의하는 블록으로, 각각의 컴포넌트는 고유의 상태(State)와 속성(Props)을 가질 수 있습니다. 이 컴포넌트들을 조합하여 복잡한 UI를 만들 수 있습니다.

JSX 문법

JSX는 JavaScript XML의 줄임말로, JavaScript와 유사한 문법으로 HTML을 작성할 수 있게 해줍니다. JSX를 사용하면 JavaScript 코드 내에서 HTML 태그를 쉽게 사용하여 UI를 정의할 수 있습니다. 이 문법은 가독성이 좋고 직관적이어서 리액트에서 널리 사용됩니다.

상태 관리(State Management)

리액트에서 상태(State)는 컴포넌트의 동적인 데이터를 관리하는 방법입니다. 상태는 컴포넌트 내에서 관리되며, 상태가 변경되면 리액트는 해당 상태와 연관된 UI를 자동으로 업데이트합니다. 상태 관리의 기본 원리를 이해하는 것은 리액트 개발의 핵심 중 하나입니다.

Props와 State의 차이

Props는 컴포넌트 간의 데이터를 전달하기 위한 방법이고, State는 컴포넌트 내에서 관리되는 데이터입니다. Props는 상위 컴포넌트로부터 하위 컴포넌트로 전달되며, State는 컴포넌트 자체에서 관리됩니다. 이 둘의 차이를 명확히 이해하는 것이 중요합니다.


3. 리액트 프로젝트 실습

이제 리액트의 이론적인 기초를 다졌다면, 실제로 프로젝트를 통해 실습해보는 것이 필요합니다. 이 페이지에서는 리액트 개발 환경을 설정하고, 간단한 리액트 애플리케이션을 만들어보는 과정을 다룹니다.

개발 환경 설정

리액트 개발을 위해 필요한 도구를 설치합니다. 주로 사용하는 도구는 다음과 같습니다:

  • Node.js와 npm
  • 코드 편집기 (VSCode 추천)
  • Create React App (CRA) 도구

CRA를 사용하면 기본적인 리액트 프로젝트 구조를 자동으로 생성할 수 있습니다. 명령어 한 줄로 쉽게 개발 환경을 설정할 수 있습니다.

npx create-react-app my-app
cd my-app
npm start