분류 전체보기 172

[도커] 11. 환경변수

도커에 들어있는 앱을 사용할때 데이터베이스 사용자 이름같은 환경변수를 주입해야 할 때가 있다. Dockerfile을 만들 때 편리한 방법으로 환경변수를 넣을 수 있다. 폴더 구성 ├── Dockerfile ├── app.py └── templates └── main.html 폴더 구조는 위와 같다. 간단한 플라스크를 이용해서 테스트해보고자 한다. # app.py from flask import Flask, render_template import os app = Flask(__name__) user = os.environ.get("USER_NAME") port = os.environ.get("PORT") @app.route("/") def main(): return render_template("main..

[도커] 10. 도커 네트워크

컨테이너에서 외부 api를 불러온다든지 다른 컨테이너의 api를사용하는 등 컨테이너에서 통신이 필요할 때가 있다. 실제로 컨테이너를 하나만 사용할 경우는 별로 없고 프론트 컨테이너, 백엔드 컨테이너, 데이터베이스 컨테이너를 한번에 사용하는 것처럼 여러개의 컨테이너가 통신해야 하는 경우가 많다. 이러한 통신을 하는 방법에 대해서 알아보자. 유스케이스 일단 컨테이너에서 통신을 하는 경우가 크게 아래와 같을 것이다. 여기서 호스트 컴퓨터는 도커를 실행하고 있는 컴퓨터이다. 5번과 6번은 실질적으로 컨테이너간의 통신이기 때문에 하나의 경우라고 봐도 된다. 물론 1부터 6까지 모든 연결이 가능하다. 이제 어떻게 통신하는지 알아보자. 위 통신을 위해 간단한 파일 두개를 한 폴더에 만들었다. # app.py from..

[스프링] 9. 쿼리메소드

지난 시간에 JPA를 이용하여 findById, findAll등의 메소드를 사용하여 데이터베이스에 접근할 수 있다는 것을 알았다. 그때는 간단하게만 살펴보았는데 복잡한 SQL문을 처리하고 싶을 수 있다. SQL문의 꽃이라고 볼 수 있는 select, from, where등을 사용할 수 있도록 하는 메소드가 쿼리메소드이다. // repository/UserRepository.java public interface UserRepository extends JpaRepository { List findByName(String name); } 위 메소드를 정의하고 테스트해보자. // test/repository/UserRepositoryTest.java @SpringBootTest class UserReposi..

[스프링] 8. JPA

JPA (Java Persistence API) 현재 자바에서 ORM기술 표준으로 알려져 있다. 스프링만을 위한 것은 아니고 자바 전반적으로 사용되는 듯 하다. 지난 시간 도메인 객체를 만들 때 Id, GeneratedValue, Entity 어노테이션이 그 예이다. 메소드명 의미 save 객체 하나를 삽입한다. saveAll 여러개의 객체를 동시에 삽입한다. findById 특정 Id를 가진 객체를 검색한다.(Optional로 반환) findAll 테이블에 존재하는 모든 객체를 검색한다. deleteById 해당하는 Id를 가진 객체를 삭제한다. deleteAll 모든 객체를 삭제한다.(위험) delete 해당 객체를 삭제한다. deleteAllInBatch 모든 객체를 삭제하는데 한번의 SQL만 호출..

[알고리즘] Codeforces Round #811 (Div. 3)

오랜만에 코드포스 컨테스트 글을 올려보려고 한다. rated대회는 무서워서 못치겠고 버추얼을 돌리면서 실력을 키우고 도전하려고 한다.(그리고 파란색이 너무 예뻐서 유지하고 싶다.) Codeforces Round #811 (Div. 3) A - Everyone Loves to Sleep [Solved!] 현재 시간이 주어지고 $n$개의 시간이 주어질 때 현재 시간 이후의 시간 중 가장 빠른 시간과의 차이를 구하는 문제이다. 시간을 분으로 고쳐서 정렬한 후 완전탐색 해서 구하면 된다. 다만 현재 시간이 주어진 시간보다 뒤일 수 있으므로 주어진 시간중 가장 빠른 시간에서 $24 \times 60 = 1440$을 더해 맨 뒤에 추가한 후 탐색한다. B - Remove Prefix [Solved!] 앞에서부터 몇..

[스프링] 7. Object Relational Mapping

지난시간에 DTO를 위해 Object Mapping이 자동적으로 적용된다는 사실을 알게 되었다. Object Mapping은 데이터 전송을 위한 객체를 json으로 변환해주는 작업이었는데 이번엔 데이터베이스에 자동으로 매핑해주는 Object Relational Mapping(ORM)을 알아보려고 한다. Object Mapping : Object $\leftrightarrow$ Json Object Relational Mapping(ORM) : Object $\leftrightarrow$ Relation(Table) ORM을 모르는 상태라면 데이터베이스를 조작하기 위해 SQL문법을 배우고 직접 사용하며 해당 언어와 데이터베이스를 연결하는 라이브러리를 알아야 한다. (실제로 내가 ORM을 몰라서 School..

[스프링] 6. 테스트코드 작성

지금까지는 코드 작성이 정상적으로 실행되는지를 서버를 켜고 API를 요청하는 방법으로 확인했다. 확실하긴 하지만 사람이 테스트한다는 점에서 귀찮음이 있다. 코드를 통해서 자동화하는 방법을 알아보고자 한다. // controller/ApiController.java @RestController @RequestMapping("/api") public class ApiController { @GetMapping("/") public String hello(){ return "Hello"; } } 간단한 코드를 하나 작성했다. 클래스 안에 커서를 두고 Ctrl + Shift + T를 누르면 테스트코드 작성 창이 나온다. 확인을 누르면 테스트 폴더에 같은 레벨의 폴더에 테스트 코드가 만들어진다. // test/c..

[알고리즘] UCPC 2022 본선 후기

인생에서 마지막 UCPC를 후회없게 마무리했다. 최근 3개년 UCPC본선 문제를 확인해보니 한문제가 골드급이고 나머지는 플래급 이상이어서 한문제만 풀자라는 느낌으로 참가했는데 생각보다 쉬운 문제가 꽤 있어서 재미있게 풀었던 것 같다. 대회는 삼성 스페이스쉐어에서 진행됐고 티셔츠와 식사, 간식거리가 무한제공 되었다. 또한 많은 후원사의 기념품도 받아왔다. Before Contest 자리배치가 왼쪽같을 줄 알았는데 오른쪽모양 배치여서 살짝 부담스러웠다. 11시 시작이었지만 모종의 이유로 5분이 미뤄졌고 뭔가 앞에서 통제를 해야할 것 같은 분위기였는데 4분까지 아무 통제가 없어 어수선하다가 5분에 시작됐다. During Contest 00:00 문제가 12문제여서 각각 4문제씩 보기로 하고 내가 A~D를 읽기..