TIL

TIL - 웹 기본 지식

yolang 2025. 1. 18. 23:44
728x90

📚 Today's TODO

✅ 모든 개발자를 위한 HTTP 웹 기본 지식 섹션 2, 3, 4, 5

📡 새로 알게 된 내용

🗃️ 모든 개발자를 위한 HTTP 웹 기본 지식 섹션 2, 3, 4, 5

  • URI: Uniform Resource Identifier
  • URL: Uniform Resource Locator
    • query: path 뒤에 ?로 시작해서 &로 추가할 수 있음
  • http: hyper text transfer protocol
  • 무상태 프로토콜 : 무상태로 서버를 만들어서 특정 서버에 의존하지 않도록 
  • Http는 기본적으로 비연결성을 지니고 있음. 항상 연결되어 있는 게 아니라 요청이 오면 살렸다가 보내면 죽임.
    • 장점으로는 서버의 효율성을 높힐 수 있음
    • 단점으로는 3 way handshake를 해야하므로 시간이 더 걸림
    • ➡️ 그래서 요즘은 지속연결 (Persistent Connections) 로 문제 해결

https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages

  • 200: 성공, 400: 클라이언트 요청 문제, 500: 서버 문제
  • ✨API URL 고민
    • URI의 의미가 uniform resource identifier 이니까 Resource를 잘 구분하는 게 중요
    • 리소스와 행위는 분리해야한다.
  • POST는 단순히 등록하는 것을 넘어서 서버에 변경사항이 생기는 모든 행동을 포함함.
  • PUT와 POST의 차이점은 PUT은 여러번 보내도 같은 효과가 보장된다.(멱등) 아예 덮어버리는 것. 갈아치는 것.
  • PATCH가 부분 변경하는 것
  • Cacheable
    • GET, HEAD, POST, PATCH 가능하나
    • GET만 사실 실무에서 캐시함.

🪄 코테 문제 언어 바꿔보기

프로그래머스 가사검색 Python ➡️ Java

[Key Functions]

  • word.toCharArray() : String을 CharArray로 바꿔줌
  • trie.putIfAbsent(length, new Trie()); : HashMap 에 없으면 넣어줌 
  • node.children.containsKey(q) : HashMap 의 Key에 있으면 넣어줌
  • new StringBuilder(query).reverse().toString() : String에서 index의 char 찾아줌
  • HashMap
    • get(idx)
    • put( )
더보기
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class TrieNode {
    public int count = 0;
    public HashMap<Character, TrieNode> children;

    public TrieNode() {
        this.count = 0;
        this.children = new HashMap<>();
    }
}

class Trie {
    TrieNode root;

    public Trie() {
        this.root = new TrieNode();
    }

    public void insert(String word){
        TrieNode node = root;
        for(char c: word.toCharArray()){
            node.children.putIfAbsent(c, new TrieNode());
            node = node.children.get(c);
            node.count++;
        }
    }

    public int search(String query){
        TrieNode node = root;
        for (char q : query.toCharArray()) {
            if (q == '?'){
                return node.count;
            }
            if (!node.children.containsKey(q)){
                return 0;
            }
            node = node.children.get(q);
        }
        return node.count;
    }
}

class Solution {
    public List<Integer> solution(String[] words, String[] queries){
        Map<Integer, Trie> trie = new HashMap<>();
        Map<Integer, Trie> reversedTrie = new HashMap<>();
        List<Integer> answer = new ArrayList<>();

        for (String word : words){
            int length = word.length();
            trie.putIfAbsent(length, new Trie());
            reversedTrie.putIfAbsent(length, new Trie());

            trie.get(length).insert(word);
            reversedTrie.get(length).insert(new StringBuilder(word).reverse().toString());
        }

        for (String query : queries){
            int length = query.length();

            if (!trie.containsKey(length)){
                answer.add(0);
                continue;
            }

            if (query.charAt(length - 1) == '?' && query.charAt(0) == '?'){
                int total = 0;

                for (TrieNode t : trie.get(length).root.children.values()) {
                    total += t.count;
                }

                answer.add(total);
                continue;
            }
            int result;
            if (query.charAt(0) == '?'){
                result = reversedTrie.get(length).search(new StringBuilder(query).reverse().toString());
            }
            else {
                result = trie.get(length).search(query);
            }
            answer.add(result);
        }
        return answer;
    }
}

👻 오늘 하루 복기

오늘 맹구 가챠 뽑았음..ㅎㅎ 야호~

 

오늘은 좀 개념에 집중해 봤다. 정처기도 나갈 준비할 때나 틈틈히 영상을 틀어놓고 있는데 pipe filter 패턴에 대해서 봤는데 헉! 싶었다. map을 통해서 filter를 사용하기 좋아하시는 분이 계셨는데 그 이론이었다. 배우는게 많다.

728x90