전체 글 31

AI의 두 번의 겨울 - XOR 문제, 기울기 소실 문제

ChatGPT 등장 이후 지금까지 AI는 뜨거운 화두이다. 이전까지는 상상도하지 못했던 것들이 AI를 활용하여 가능해졌고 하루가 멀다하고 새로운 역할을 하는 AI는 출시되고 있다.AI는 이떻게 이렇게 발전하게 되었을까? 인공지능의 탄생초기의 인공신경망은 단순 on/off 기능의 인공 신경을 그물망 형태로 연결하면 뇌에서 동작하는 간단한 기능을 흉내낼 수 있다는 이론에서 시작되었다.이 신경망 내에서 반복적인 시그널이 발생할 때 신경 세포들은 그 시그널을 기억하는 학습 효과가 있음을 바탕으로 최초의 퍼셉트론이 탄생하게 된다. AI의 첫번째 겨울허나 퍼셉트론을 통해 AND와 OR 같은 선형 분리가 가능한 문제는 해결할 수 있었지만 XOR 문제에는 적용할 수 없다는 것이 밝혀졌다.이로 인해 인공지능은 첫번째 겨..

머신러닝 2024.10.29

어노테이션은 사실 깡통이다.

이전글 : https://potwings.tistory.com/66 [Spring MVC] Filter에서 파라미터 처리하는 방법Servlet의 Filter를 구현하는 Filter클래스에서 POST로 전달되는 Body에서 JSON을 불러와 처리해야할 일이 있었다.따라서 Filter에서 아래와 같이 Request에서 값을 불러왔다. @Override public void doFilter(ServletRequpotwings.tistory.com 이전 글에서 Request에서 JSON으로 된 파라미터를 불러올 때 아래와 직접 코드 작성하여 파라미터를 받아왔었다.허나 평소에 Controller에서 JSON을 전달받을 때는 파라미터 앞에 @RequestBody를 추가해주는 것 만으로 불러올 수 있었다.  따라서 ..

BackEnd/Spring 2024.09.22

Spring Boot main 2배 버그 팝니다@@@@@

최근 cli로 된 어플리케이션을 개발하였다.어플리케이션 실행 후 사용할 DB 정보를 입력을 통하여 받고 싶었으나 Spring의 경우 DataSource가 우선 생성되어야 어플리케이션이 실행될 수 있었다. 따라서 Spring 구동 이전의 main 메소드에서 DB 정보를 받아오도록 아래와 같이 진행하였다.  public static void main(String[] args) { try { br = new BufferedReader(new InputStreamReader(System.in)); String dbUrl = validDBURL(); // IP PORT 연결 테스트 String schema = validInputString("DB 스키마"); jdbcUr..

BackEnd/Spring 2024.09.18

텍스트 전처리(1) - 토큰화, 정제, 정규화

토큰화주어진 문장에서의미 부여가 가능한 단위를 찾는 것 단순 공백 기준으로 잘라낼 경우 아래와 같은 이슈가 있다.단어나 숫자에 특수 문자가 들어가는 경우 존재 (ex. AT&T, $45.55)줄임말과 단어 내에 띄어쓰기가 있는 경우 존재 (ex. We’re, I’m)이와 같은 이유로 인해 섬세한 알고리즘이 필요하다. 품사 태깅단어가 어떤 품사로 사용되었는지 구분해놓는 것. 토큰화 후 진행 가능하다.어떤 품사로 쓰였는지에 따라 단어의 의미가 달라질 수 있어 진행한다.ex) fly - [동사 : 날다], [명사 : 파리] 실습영어 - NLTK 라이브러리 활용from nltk.tokenize import word_tokenizefrom nltk.tag import pos_tagtext = "I'd like t..

머신러닝 2024.09.03

[Spring MVC] Filter에서 파라미터 처리하는 방법

Servlet의 Filter를 구현하는 Filter클래스에서 POST로 전달되는 Body에서 JSON을 불러와 처리해야할 일이 있었다.따라서 Filter에서 아래와 같이 Request에서 값을 불러왔다. @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { ServletInputStream inputStream = request.getInputStream(); ObjectMapper objectMapper = new ObjectMapper(); PersonDTO dto = objectMapper.readV..

BackEnd/Spring 2024.08.01

문자열 탐색 성능 개선

필자는 웹메일 업체에서 스팸 차단 솔루션 개발을 담당하고 있다.스팸 차단 솔루션의 특성상 관리자/사용자가 등록한 필터들을 활용한 많은 문자열 탐색이 일어난다.이 기능을 개선하면 솔루션의 성능이 크게 향상될 것이라고 판단하여 진행하게 되었다. 우선 결론부터 말하자면 패턴 매칭의 성능 개선은 진행되지 못하였다.허나 누군가가 나와 같은 고민을 하고 있을 경우 도움을 받을 수 있도록, 또 나와 같은 실수를 하지 않도록 하기 위해 기록하고자 한다.시작 - 어떻게 개선하려 하였는가?우선 회사에서 열심히 놀고 있는 도중 우아한형제 블로그의 아래 글을 보게 되었다.https://techblog.woowahan.com/15764 고르곤졸라는 되지만 고르곤 졸라는 안 돼! 배달의민족에서 금칙어를 관리하는 방법 | 우아한형..

개발일지 2024.05.30

KMP - 문자열 탐색 알고리즘 (By Java)

문자열 탐색 성능 개선 중 KMP알고리즘을 사용하면 기존의 브루트포스 알고리즘보다 더 좋은 성능이 나온다는 이야기를 들었다.정확히 어떻게 성능을 더 빠르게 하는지가 궁금하여 자세한 내용을 정리해보고자 한다. 이 글은 아래 글을 참고하여 작성하였다.https://bowbowbow.tistory.com/6 KMP : 문자열 검색 알고리즘문자열 검색이 뭐지? 워드프로세서를 사용할 때 찾기 기능을 사용한적 있을 겁니다. 브라우저에서도 Ctrl+F 단축키를 눌러 검색할 수 있습니다. 아래 이미지는 브라우저에서 "테이프"를 검색했을bowbowbow.tistory.com KMP 알고리즘이란?문자열 비교 시 효율적인 인덱스 조정을 통해 이미 비교했던 문자열을 최대한 다시 비교하지 않도록 하여 성능을 개선한 문자열 탐색..

BackEnd/Java 2024.05.29

X바(자바) finalize 메소드 쓰지마세요

Java9부터는 Deprecate 되었어요 쓰지 마세요. 과거 필자는 특정 객체 동작하면서 남긴 임시 파일을 해당 객체가 소멸될 때 제거되도록 하기 위해finalize 메소드를 사용하여 처리하려 했던 적이 있었다.허나 적용하기 위해 검색하여 보니 finalize 메소드를 사용하지 말라는 내용이 많았고이펙티브 자바에 자세하게 설명되어 있어 이 내용을 한번 정리해보고자 한다. finalizer란?자바에서 객체가 더 이상 참조되지 않을 때 Garbage Collector가 객체에 할당한 메모리를 회수하기 전객체의 finalize 메소드의 내용을 진행하는 객체 소멸자이다.이외에도 자바에는 cleaner라는 객체 소멸자가 하나 더 있다. finalizer 예시public class Finalize { @Over..

BackEnd/Java 2024.05.06

Java HashMap의 내부 동작 - 해시 버킷 개수 조정

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 자바의 HashMap의 성능을 위한 해시 버킷의 개수에 관련해 알아보자 해시 버킷 개수 조정 우선 저번 글에서 확인하였듯이 HashMap에서는 데이터를 해시버킷에 나누어 저장해둔다. 여기서 해시버킷의 인덱스 계산을 "X.hashCode() % M(해시 버킷의 개수)"을 통하여 진행하는데 만일 해시버킷의 개수가 적다면 데이터가 증가할 수록 더 많은 해시충돌이 발생할 것이고, 이는 성능 저하로 이어지게 된다. 이를 방지하기 위해 HashMap에서는 데이터 개수가 "load factor(기본값 3/4) * 현재 해시 버킷의 개수"에..

BackEnd/Java 2024.04.21

Java HashMap의 내부 동작 - 실전편

관련 포스팅 Java HashMap의 내부 동작 - 이론편 Java HashMap의 내부 동작 - 실전편 Java HashMap의 내부 동작 - 해시 버킷 개수 조정 이번 글에서는 Java에 HashMap이 실제 코드로 어떻게 되어있는지 확인해보자 한다. 데이터 삽입(put) put 메소드의 데이터 추가는 아래 3가지의 경우를 순서대로 처리한다. 1. 해당 인덱스의 해시 버킷(LinkedList) 확인 - 해당 해시 버킷에 값이 없을 경우 새로운 Node 추가 후 종료 2. 해당 해시 버킷의 키 값 일치여부 확인 - key가 일치할 경우 해당 키에 대한 값 변경해준 후 종료 3. 해당 해시 버킷에 값 추가 - Tree일 경우와 / LinkedList일 경우 분기하여 처리 final V putVal(int..

BackEnd/Java 2024.04.16